'Reversing/WriteUp'에 해당되는 글 8건

  1. 2017.04.30 [Plaid CTF] zipper
  2. 2017.03.03 [2017codgate] RamG
  3. 2017.02.21 [Reversing.kr] CSHARP
  4. 2017.02.21 [Reversing.kr] Ransomware
  5. 2017.02.21 [Reversing.kr] Replace
  6. 2017.02.17 [2017codegate] BabyMISC
  7. 2017.02.12 [Reversing.kr] Easy Crack
  8. 2017.02.10 [xcz] Prob9_Easy Reversing
Reversing/WriteUp2017. 4. 30. 01:36

문제사이트 : Plaid CTF

문제이름 : zipper

링크 : X

 

풀이

↑문제파일

 

 

 

↑내가 만든 비교파일

 

zip파일이 깨진 문제파일이다. 구글의 zip header를 보며 정상적인 zip파일과 비교해보았다.

그랬더니 zip파일의 이름과 이름길이 헤더부분이 고장난 듯 보였다.

알맞게 고쳐서 입력하였더니 플래그를 얻을 수 있었다.

'Reversing > WriteUp' 카테고리의 다른 글

[2017codgate] RamG  (0) 2017.03.03
[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
Posted by BadSchool
Reversing/WriteUp2017. 3. 3. 02:19

문제사이트 : Codegate

문제이름 : RamG

링크 : X


풀이


↑프로그램을 실행하면 나오는 화면이다. 4를 누르면 히든메뉴가 나타나는데,

두개의 문자열을 입력받고 어떠한 과정을통해 c라는 파일 하나가 생성된다.



↑보다시피 c라는 파일은 뒤죽박죽이다. 일단 프로그램을 분석해보았다.



↑올리디버거를 켜기 전에 BinText로 쭉 훑어보았다.

그 중 상당히 수상해보이는 문자열들이 보였다. 개수도 같고 입력받는 부분 바로전에 쓰여있어

메모장에 적어두었다.



↑문제파일의 기능 중 두 문자열을 XOR해주는 기능이 있었다. 

아까 의심스러웠던 문자열을 시험삼아 해보다가 수상한 문자열 하나가 나왔다.

일단 이것도 메모장에 적어두었다.



↑본격적으로 분석하였다. 처음 문자열을 입력받은 후 진행되는 연산이다.

아까 수상하다고생각한 MVYLXYUARJ 와 474591474591을 xor하는 모습이 보였다.



↑그래서 RamG 기능으로 XOR해보았더니 yamyambugs라는 문자열이 나왔다.

이것이 첫번째 시크릿 코드이다.



↑스테이지 2로 넘어가려는 길목에 상당히 견고해보이는 안티디버깅 코드가 보였다.

레지스트리 변조나 점프문을 NOP으로 바꾸면 지나갈 수 있다.



↑두번째 스테이지에서는 cmp구문이 3개가 나온다.

덤프로 들어가서 맞게 변조해주면 지나갈 수 있다.



↑세번째 스테이지 에서는 레지스트리가 있는지와 그 내용을 점검하여 맞다면 hel을 저장한다.

hel을 저장할 수 있게 코드를 잘 수정해주면 된다.



↑4번째 스테이지는 2번째와 동일하게 진행하면 된다.



↑5번째 스테이지로 가는 길목에 안티디버깅이 있는데 전과 동일하게 넘어가면된다.

마지막은 1번째 스테이지 처럼 문자열을 비교하는데, 원리는 같고 예상한대로 의심되었던

hellowfish를 입력해주면 된다.



↑메모는 리버싱문제의 필수인듯 하다.


↑c파일이 생성되고 뒤에 확장자 .png를 붙이게 되면 플래그가 보인다.



이 문제는 유난히 운이 좋게 얻어걸린(?) 부분이 많았던 문제였다.

어렵긴 했지만 푸는과정이 재미있어서 좋은 문제라고 생각된다.



'Reversing > WriteUp' 카테고리의 다른 글

[Plaid CTF] zipper  (0) 2017.04.30
[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
Posted by BadSchool
Reversing/WriteUp2017. 2. 21. 23:21

문제사이트 : Reversing.kr

문제이름 : CSHARP

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행해 보니 딱봐도 내가 싫어하는 C#문제가 보인다. 내용은 간단하게 비밀번호를 알아내면 되는 문제이다. 이상하게도 구글에는 풀이가 거의다 잠겨있어서 나도 전체를 다 풀이하진 않을것이다. 그래도 도움이 많이 될 듯싶다.



↑분석을 위해 NET Reflector로 열어보았다. 몇몇 수상한 코드들이 보였지만 나는 C#을 잘모르기때문에 핵심만 찾아보았다. 그중 수상한 "MetMett"라는 함수가 보였는데 이상하게도 열리지않았다.




↑그러던 중 .ctor에서 수상한 코드를 발견했다. MetMett를 암, 복호화 시키는 듯한 코드였다.

검색을 해보니 ctor은 메인함수가 실행되기 전에 가장 먼저 실행되는 부분이라고 한다.

즉 프로그램을 실행하면 암호화되어있는 MetMett부분을 이 코드로 복호화시켜준다는 말이다.




↑IDA로 분석해 본 결과 이 부분들이 암호화된 MetMett 였다.

간단하게 C언어로 복호화코드를 만들었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
void main(){
    int arr[] = { 0x020x8D0x680x1E0x0B0x3F0xDE0xFF0xFF0xFF0x010x150x170x9B0x020x150x900x1F0x8F0xFF0xFF0xFF0x600x1E,  0x490x2D0x030x010x150x160x9B0x020x180x900x1F0x8F0xFF0xFF0xFF0x600x1E0x450x2D0x030x010x150x160x9B0x020x160x900x1F0x8F0xFF0xFF0xFF,  0x600x1E0x560x2D0x030x010x150x160x9B0x020x170x900x1F0x8F0xFF0xFF0xFF0x600x1E0x4C0x2D0x030x010x150x160x9B0x020x1E0x0A0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x2B0x2D0x030x010x150x160x9B0x020x1D0x900x1F,  0x8F0xFF0xFF0xFF0x600x1F0xF00xFF0xFF0xFF0x2D0x030x010x150x160x9B0x020x190x900x1F0x8F0xFF0xFF0xFF0x600x1E0x1C0x2D0x030x010x150x16,  0x9B0x020x1A0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x300x2D0x030x010x150x160x9B0x020x1E0x080x900x1F0x8F0xFF0xFF0xFF0x600x1F0xE10xFF0xFF,  0xFF0x2D0x030x010x150x160x9B0x020x1C0x900x1F0x8F0xFF0xFF0xFF0x60,  0x1F0xED0xFF0xFF0xFF0x2D0x030x010x150x160x9B0x020x1E0x090x900x1F0x8F0xFF0xFF0xFF0x600x1F0xA20xFF0xFF0xFF0x2D0x030x010x150x160x9B,  0x020x1B0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x740x2D0x030x010x150x16,  0x9B0x29 ,0x00 };
    int num = 0;
    int sum = 0;
 
    for (int i = 0; arr[i] != 0x00; i++)
    {      
        arr[i] += 1;
        arr[i] &= 0xFF;
        sum += arr[i];
        sum &= 0xFF;
        num++;
    }
 
    arr[18= (sum - 38& 0xFF;
    arr[35= (sum - 3& 0xFF;
    arr[52= (sum ^ 39& 0xFF;
    arr[69= (sum - 21& 0xFF;
    arr[87= (71 - sum) & 0xFF;
    arr[124= (sum ^ 114& 0xFF
    arr[141= (sum ^ 80& 0xFF
    arr[159= (235 - sum) & 0xFF;  
    arr[179= (106 + sum) & 0xFF;   
    arr[200= (36 - sum) & 0xFF;   
    arr[220= (sum - 3& 0xFF;
 
    for (int i = 0; i < num; i++)
              printf("%02X ", arr[i]);
}
 
cs

↑그 후 헥스에디터로 복호화 된 값을 패치하고 분석툴로 다시열어보자 MetMett 부분이 보였다.

자세한 사항들은 더 적지 않겠지만, 이곳이 비밀번호를 체크하는 부분이다.


이 코드를 분석하여 비밀번호를 알아내었다.


'Reversing > WriteUp' 카테고리의 다른 글

[Plaid CTF] zipper  (0) 2017.04.30
[2017codgate] RamG  (0) 2017.03.03
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
Posted by BadSchool
Reversing/WriteUp2017. 2. 21. 02:18

문제사이트 : Reversing.kr

문제이름 : Ransomware

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행 한 화면이다. 어떤 더덩넘이 파일을 암호화시키고 5천억 달러를 벌려고 한다. 정말 나쁜놈 인듯 싶다. Key를 입력하면 파일이 복구되지만 잘못되면 더 꼬인다고 한다.
일단 우리의 올리디버거로 확인을 해보자.

참고로 이 파일은 UPX로 패킹되어 있다. 어떤 문제던 풀기 전에 패킹여부 확인은 필수이다.



↑분석을 해보니 파란색으로 하이라이트 한 부분에서 내가 입력한 키값을 순서대로 한글자씩 불러오고, 암호화 된 파일의 바이너리값도 가져와서 XOR연산을 한 뒤 0xFF로 또한번 XOR연산 해준다.

즉 순서대로 보면 

파일 ^ 입력값 ^ 0xFF



↑여기서 중요한 힌트가 하나 있는데, 바로 암호화 된 파일이 EXE파일 이라는 것이다. 그뜻인 즉 파일헤더 부분이 보통 EXE파일과 같다는 것. 이를 통해 코드를 짜 볼 수 있다.



↑file 의 한줄과 일반exe파일의 한줄을 가져와서 코드를 짰다. 코드자체에서도 불러올 수 있겠지만 미숙한 관계로..


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
void main()
{
    int arr[] = { 0xDE ,0xC0 ,0x1B ,0x8C ,0x8C ,0x93 ,0x9E ,0x86 ,0x98 ,0x97 ,0x9A ,0x8C ,0x73 ,0x6C ,0x9A ,0x8B };
    int arr2[] = { 0x4D0x5A , 0x90 , 0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0xFF , 0xFF , 0x00 , 0x00 };
    int result[16= { NULL };
    int xor = 0;
    for (int i = 0; i < 16; i++)
        arr[i] = arr[i] ^ 0xFF;
 
    for (int i = 0; i < 16; i++)
    {
        for (int j = 1; ; j++)
        {
            xor = arr[i] ^ j;
            if (arr2[i] == xor)
            {
                printf("%c", j);
                break;
            }
        }
    }
    printf("\n");
}
cs

↑코드 실행 결과. letsplaychess까지 출력되고 다시 반복되는 듯 하다.



↑아까 구해낸 키값을 입력하여 복호화 시켰다.

참고로 복호화 된 exe파일도 UPX로 패킹되어 있다. 가볍게 언패킹 시키고 툴로보니 답이 바로 나왔다.



↑답 : Colle System.


'Reversing > WriteUp' 카테고리의 다른 글

[2017codgate] RamG  (0) 2017.03.03
[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
[Reversing.kr] Easy Crack  (0) 2017.02.12
Posted by BadSchool
Reversing/WriteUp2017. 2. 21. 00:51

문제사이트 : Reversing.kr

문제이름 : Replace

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행하고 Check 버튼을 누르면 나오는 화면

문제의 시작부터 상당히 불친절하다.ㅎㅎ


↑올리디버거로 보아하니 이 부분에서 오류가 난다. 아마도 EAX값과 같은 메모리 주소가 없어서 예외처리가 나는것으로 보인다. 90은 NOP인데, 아마도 correct로 가지 못하게 하는 코드부분의 주소값을 이 부분에서 NOP처리하게 만들면 정상실행이 될 것 같이 보인다. 

(correct로 가지 못하게 하는 점프문은 401071이다)



↑물론 이렇게 직접 EAX값을 수정해 주면 Correct를 볼 수 있다. 하지만 문제는 우리가 무슨값을 입력해야 Correct가 나오는지 알아야 하기 때문에 의미가 없다고 할 수 있다.



↑일단 우리가 입력한 값이 어떻게 변화하는지 보기위해 BP을 걸고 확인하여 보았다.

입력한 값은 4084D0 이라는 곳에 저장이 된다.



↑쭉 넘어가 보니 몇몇 연산들이 보였다.

대충 보자면 함수들을 호출하여 4084D0에 INC를 해주는 모습이다. 순서를 따져보자면

입력한 값 + 0x1 + 0x1 + 0x601605C7 + 0x1 + 0x1

으로 정리해 볼 수 있다.

즉 정리해 보자면

입력한값 + 0x601605CB = 0x401071 이다.

계산기 조금만 뚜드려 보면 답을 알 수 있다.


'Reversing > WriteUp' 카테고리의 다른 글

[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
[Reversing.kr] Easy Crack  (0) 2017.02.12
[xcz] Prob9_Easy Reversing  (0) 2017.02.10
Posted by BadSchool
Reversing/WriteUp2017. 2. 17. 17:41

문제사이트 : Codegate

문제이름 : BabyMISC

링크 : X


풀이


↑STAGE 1의 코드이다. 분석해보니 사용자에게 입력받는 값의 base64decode 값이

TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oig=의 디코드 값과 같아야 하며

입력한 값과 길이도 같아야 한다. 그런데 TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oig=과 입력한값이 같으면 안된다.

언듯 보았을 때는 모순적으로 보일수도 있다. 하지만 base64의 특성을 이용하여 마지막값만 하나 바꿔서 입력해주면 넘어간다.

입력 : TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oih=



↑끝자리만 h로 바꿔주자 다음 스테이지로 넘어갔다.



↑STAGE 2는 두번 값을 입력받는데, 그 두개의 입력값의 길이가 다르며 base64decode 값은 같아야 한다.

이 또한 모순적일 수 있으나 단지 두번째 값에 =을 하나더 붙여주면 넘어가는 스테이지 이다.



↑등호 하나만 더 입력해주자 넘어가 졌다.

입력 : TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oih=

TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oih==



↑마지막으로 우리에게 단 하나의 명령어를 base64로 입력할 수 있는 기회를 준다. 하지만 분석해보면

[/|$|-|_|&|>|`|'|"|%|;]|(cat)|(flag)|(bin)|(sh)|(bash) 을 필터링 하고 있다.



↑ 필터링 하는 모습.


서버로 연결한 것이 아닌 파일을 실행해서 푸는거라 STAGE3을 푸는 사진은 캡처하지 못했다.


기억나는 대로 쓰자면 우선 ls -la를 base64코드로 입력하여 플래그 파일을 찾는다.


그리고 head * 명령어를 base64코드로 입력해 주면 플래그 파일이 출력되며 결과를 알 수 있다.


head 명령어는 파일의 내용을 위에서부터 10줄 출력해 내는 명령어 이다.



'Reversing > WriteUp' 카테고리의 다른 글

[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[Reversing.kr] Easy Crack  (0) 2017.02.12
[xcz] Prob9_Easy Reversing  (0) 2017.02.10
Posted by BadSchool
Reversing/WriteUp2017. 2. 12. 16:36

문제사이트 : Reversing.kr

문제이름 : Easy Crack

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행하여 text목록을 보니 익숙한 멘트들이 보였다.

 

↑빨간부분에서 정답인지 아닌지 확인한다.

 

↑12345678을 입력하고 시작지점에 브레이크 포인트를 걸고 보니

파란색 CMP 부분에서 내가 입력한 2와 아스키코드 61을 비교하였다.

61은 a 이므로 두번째 글자는 a이다.

Pw = XaXXXXXXX

 

 

↑1a345678을 입력하고 더 내려가 보니 5y라는 문자열이 보인다.

스크린샷을 못찍었지만 밑의 call문에서 34와 5y를 비교한다.

pw = Xa5yXXXXXX

 

 

↑1a5y5678를 입력하고 내려가보니 아주 수상한 R3versing이라는 문자열이 보인다.

파란색의 밑에부분부터 보면 내가 입력한 5678문자열과 R3versing문자열을 반복문으로 비교한다.

따라서 뒷부분은 R3versing

pw = Xa5yR3versing

 

 

↑마지막으로 첫번째 글자만 알아내면 된다. 사진의 CMP부분을보면 내가입력한

1가 45를 비교한다. 45는 아스키코드표에서 E로 나오므로 첫번째 글자는 E이다.

 

 

↑따라서 비밀번호는 Ea5yR3versing


'Reversing > WriteUp' 카테고리의 다른 글

[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
[xcz] Prob9_Easy Reversing  (0) 2017.02.10
Posted by BadSchool
Reversing/WriteUp2017. 2. 10. 22:57

문제사이트 : XCZ

문제이름 : Prob9_Easy Reversing

링크 : http://xcz.kr/START/prob/prob9.php


풀이 :


↑REV.exe파일을 다운로드받아 ID에 1234, PW에 5678을 입력한 모습

우측 상단을 보면 내가 입력한 ID값인 1234와 "XCZ"라는 문자열을 비교하고있다.


↑이와같이 ID가 XCZ가 아닐 시에는 who are you???출력 부분으로 점프한다.

따라서 ID = XCZ

↑ID를 XCZ로 입력하고 쭉 넘어가보니 아까와 비슷한 상황이 나온다.

똑같이 생각하여 PW = UNL1M1T


↑실행 후 ID와 PW를 입력해주면 키값이 나온다.

'Reversing > WriteUp' 카테고리의 다른 글

[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
[Reversing.kr] Easy Crack  (0) 2017.02.12
Posted by BadSchool