PADOCON 2010 hand-ray 리버싱 풀이 3rd

PADOCON 2010 핸드레이 세 번째 문제는 두 번째 문제보다 더 많은 삽질을 요구했습니다. 예선전 문제였던 ddanjin과 유형이 같은데요, 차이라 하면은 핸드레이로 풀어야 한다는 것 뿐이네요…

문제

다음 코드에서 입력코드가 k1n0TheBest 일 때 출력될 값은 무엇인가?

00401000  /$  83EC 70                 SUB ESP,70
00401003  |.  A1 34604000             MOV EAX,DWORD PTR DS:[406034]
00401008  |.  8B0D 38604000           MOV ECX,DWORD PTR DS:[406038]
0040100E  |.  8B15 3C604000           MOV EDX,DWORD PTR DS:[40603C]
00401014  |.  894424 0C               MOV DWORD PTR SS:[ESP+C],EAX
00401018  |.  894C24 10               MOV DWORD PTR SS:[ESP+10],ECX
0040101C  |.  33C0                    XOR EAX,EAX
0040101E  |.  33C9                    XOR ECX,ECX
00401020  |.  895424 14               MOV DWORD PTR SS:[ESP+14],EDX
00401024  |.  894C24 01               MOV DWORD PTR SS:[ESP+1],ECX
00401028  |.  BA 0C000000             MOV EDX,0C
0040102D  |.  894C24 05               MOV DWORD PTR SS:[ESP+5],ECX
00401031  |.  895424 30               MOV DWORD PTR SS:[ESP+30],EDX
00401035  |.  66:894C24 09            MOV WORD PTR SS:[ESP+9],CX
0040103A  |.  895424 3C               MOV DWORD PTR SS:[ESP+3C],EDX
0040103E  |.  B9 09000000             MOV ECX,9
00401043  |.  BA 01000000             MOV EDX,1
00401048  |.  884424 00               MOV BYTE PTR SS:[ESP],AL
0040104C  |.  C74424 18 02000000      MOV DWORD PTR SS:[ESP+18],2
00401054  |.  C74424 1C 0A000000      MOV DWORD PTR SS:[ESP+1C],0A
0040105C  |.  C74424 20 04000000      MOV DWORD PTR SS:[ESP+20],4
00401064  |.  C74424 24 08000000      MOV DWORD PTR SS:[ESP+24],8
0040106C  |.  C74424 28 0B000000      MOV DWORD PTR SS:[ESP+28],0B
00401074  |.  C74424 2C 05000000      MOV DWORD PTR SS:[ESP+2C],5
0040107C  |.  894C24 34               MOV DWORD PTR SS:[ESP+34],ECX
00401080  |.  C74424 38 0F000000      MOV DWORD PTR SS:[ESP+38],0F
00401088  |.  894424 40               MOV DWORD PTR SS:[ESP+40],EAX
0040108C  |.  C74424 44 04000000      MOV DWORD PTR SS:[ESP+44],4
00401094  |.  C74424 48 02000000      MOV DWORD PTR SS:[ESP+48],2
0040109C  |.  C74424 4C 03000000      MOV DWORD PTR SS:[ESP+4C],3
004010A4  |.  895424 50               MOV DWORD PTR SS:[ESP+50],EDX
004010A8  |.  894C24 54               MOV DWORD PTR SS:[ESP+54],ECX
004010AC  |.  C74424 58 06000000      MOV DWORD PTR SS:[ESP+58],6
004010B4  |.  C74424 5C 08000000      MOV DWORD PTR SS:[ESP+5C],8
004010BC  |.  894C24 60               MOV DWORD PTR SS:[ESP+60],ECX
004010C0  |.  C74424 64 05000000      MOV DWORD PTR SS:[ESP+64],5
004010C8  |.  894C24 68               MOV DWORD PTR SS:[ESP+68],ECX
004010CC  |.  895424 6C               MOV DWORD PTR SS:[ESP+6C],EDX
004010D0  |>  8B5484 44               /MOV EDX,DWORD PTR SS:[ESP+EAX*4+44]
004010D4  |.  8B4C84 18               |MOV ECX,DWORD PTR SS:[ESP+EAX*4+18]
004010D8  |.  33CA                    |XOR ECX,EDX
004010DA  |.  894C84 18               |MOV DWORD PTR SS:[ESP+EAX*4+18],ECX
004010DE  |.  40                      |INC EAX
004010DF  |.  8A4C0C 0C               |MOV CL,BYTE PTR SS:[ESP+ECX+C]
004010E3  |.  83F8 0B                 |CMP EAX,0B
004010E6  |.  884C04 FF               |MOV BYTE PTR SS:[ESP+EAX-1],CL
004010EA  |.^ 7C E4                   \JL SHORT Q3.004010D0
004010EC  |.  8D5424 00               LEA EDX,DWORD PTR SS:[ESP]
004010F0  |.  52                      PUSH EDX
004010F1  |.  68 30604000             PUSH Q3.00406030               ; ASCII "%s"
004010F6  |.  E8 15000000             CALL Q3.00401110               ; printf
004010FB  |.  33C0                    XOR EAX,EAX
004010FD  |.  83C4 78                 ADD ESP,78
00401100  \.  C3                      RETN


방금 전 얘기했듯이 예선전의 ddanjin과 같은 유형입니다. PADOCON 2010 CTF 예선 문제를 보신 분이라면 대충 눈치 채시겠죠? 문제를 푸는 요령은 핸드레이 두 번째 문제와 같습니다.

  • Encoding Routine이 어디인가?
  • Encoding Routine 직전의 스택은 어떤 모습인가?
  • Encoding Routine 직전의 레지스터의 값은 무엇인가?
  • ASCII 테이블

풀이

여기서부터 풀이입니다. [열기]간단한 안티 리버싱 기법이 적용되어 있는 문제입니다. ddanjin 처럼요. 키 테이블의 값들을 일일이 하나씩 입력해놓아서 분석하는 것을 힘들게 하지요. 하지만, 삽질의 핸드레이 리버싱 앞에서는 이런 것은 작은 기교에 불과합니다.

요령은 두 번째 문제와 같습니다. 먼저 Encoding Routine을 찾습니다. 이번에는 친절하게 주석이 달려 있어서 금방 찾을 수 있네요. 0x004010D0~0x004010EA 가 for/while 문으로 이루어진 Encoding Routine입니다. Encoding Routine을 찾았으니 이전까지의 스택과 레지스터를 그립니다.

사용자 삽입 이미지
[그림1]이 제가 그린 스택입니다. 이번 문제에서 스택을 그릴 때 주의할 게 두 가지 있습니다. 하나는 DWORD, WORD, BYTE를 혼동하지 않는 것입니다. DWORD는 4바이트, WORD는 2바이트, BYTE는 1바이트의 메모리를 참조하거나 쓸 때 사용하는 지시어입니다. 또 하나는 중간중간 레지스터 값을 놓치지 않아야 하는 것입니다. 키 테이블을 만들 때 상수 대신 레지스터 값을 집어넣을 수도 있거든요. 그리고 Little Endian 고려하는 것은 기본이겠죠?

스택을 그렸으니 Encoding Routine을 분석할 차례인데요. 아래에 그 과정만 살짝 빼놓았습니다.

004010D0  |>  8B5484 44               /MOV EDX,DWORD PTR SS:[ESP+EAX*4+44]
004010D4  |.  8B4C84 18               |MOV ECX,DWORD PTR SS:[ESP+EAX*4+18]
004010D8  |.  33CA                    |XOR ECX,EDX
004010DA  |.  894C84 18               |MOV DWORD PTR SS:[ESP+EAX*4+18],ECX
004010DE  |.  40                      |INC EAX
004010DF  |.  8A4C0C 0C               |MOV CL,BYTE PTR SS:[ESP+ECX+C]
004010E3  |.  83F8 0B                 |CMP EAX,0B
004010E6  |.  884C04 FF               |MOV BYTE PTR SS:[ESP+EAX-1],CL
004010EA  |.^ 7C E4                   \JL SHORT Q3.004010D0


자세히 보시면 참조하는 키 테이블이 2개라는 것을 알 수 있는데요. esp+18 ~ esp+40가 하나이고, esp+44 ~ esp+68이 또 하나입니다. EAX 값을 인덱스로 사용하죠. 그리고 각각의 인덱스에 위치한 값끼리 순서대로 XOR 연산을 합니다.

XOR 연산을 해서 얻은 값은 또 다시 인덱스로 쓰입니다. esp+c부터 위치한 입력된 문자열의 인덱스로 참조되어서 그 위치의 문자를 esp에 초기화 해놓은 메모리로 순서대로 복사하지요. 즉, 입력된 문자열의 순서를 섞는 애너그램 코드입니다.

애너그램 코드인 게 파악되니까 그 다음부터는 일사천리였습니다. 두 키 테이블의 값들을 XOR 연산해서 애너그램 순서를 구하기만 하면 되니까요. 그리하여 답은 “eeBsn0Tkth1” 입니다.


참고 문헌

Intel Instruction Set pages :: http://www3.itu.edu.tr/~kesgin/mul06/intel/index.html
ASCII printable characters :: http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters

Similar Posts

  • PADOCON 2010 hand-ray 리버싱 풀이 1st

    이번 파도콘 때 컨퍼런스 발표 외에도 섹션 밖에서 재미있는 이벤트들이 있었습니다. 그 중에서 순천향대학교 Security First 에서 핸드레이 리버싱 문제를 출제했었지요. 문제들이 재미있어서 소개합니다. 문제 다음 프로그램은 어떤 함수호출 규약을 사용하는가?? 0x00401082 에서 401005 함수를 호출합니다. 그리고 0x00404005 에서 실행 흐름이 0x00401020 으로 넘어갑니다. 이 상태에서 어떤 함수 호출 규약이 적용되었는지를 묻는 문제입니다. 따로 풀이를…

  • Brute Forcing with DLL Injection

    Articles에 문서를 업데이트 했습니다. 작년 10월, 2009 하반기 KUCIS 영남권 정보보호 세미나에서 발표했던 주제입니다. DLL Injection 기법을 이용한 무차별 대입 공격으로 패스워드를 찾아 보았습니다. 소스를 포함하여 문서를 정리할까 했는데, 악용될 소지가 있어서 발표했던 자료만 공개합니다. 당시에 발표했던 내용보다 조금 보완된 부분이 있습니다. 3개월째인 오늘까지도 이 방법을 어디에 써 먹을 수 있을지 못 찾고 있습니다. 간혹…

  • PADOCON 2010 hand-ray 리버싱 풀이 2nd

    이번에는 두 번째 문제입니다. 이전 문제와 달리 약간의 프로그래밍 경험과 리버싱 경험이 필요했었구요. 핸드레이 리버싱인 만큼 컴퓨터를 비롯한 전자식 도구를 사용하지 않고 손(필기)으로 풀이하는 게 이 문제를 즐기는 포인트입니다. 한 마디로 요약하면, “삽질”을 해야 한다는 얘기죠? 문제 다음 프로그램에서 입력값이 j3m4I7w:_oYu?yjue 일때 출력값은 무엇인가? 일부로 주석을 지웠는지 모르겠지만, 같이 풀던 후배가 살짝 당황했던 문제입니다. 이…

  • DLL Injection 은 어떻게 이루어지는가? – AppInit_DLLs 값 조작

    AppInit_DLLs 값 조작 DLL Injection에는 여러 방법이 있습니다. 그중 루트킷에 이용되는 세 가지 방법을 알아보겠는데요. 첫 번째로 레지스트리를 조작하는 방법입니다. regedit에서 위 주소의 레지스트리 값을 확인해보면, 보통은 값이 비어있습니다. 그런데 어떠한 값이 들어있다면, 그리고 그것이 자신이 모르는 어떤 파일이라면, 그것은 악성 코드일 가능성이 있습니다. 이 레지스트리 값이 무엇이냐구요? 바로 이 값이 DLL Injection에 참조되는 레지스트리…

  • DLL injection 은 어떻게 이루어지는가? – SetWindowsHookEx ()

    SetWindowsHookEx () 이번에는 윈도우즈에서 정상적으로 지원하는 후킹 함수를 이용하는 방법을 알아보겠습니다. 윈도우즈는 OS와 프로세스 간에 메시지를 주고받는데요. 키보드를 누른다던지, 마우스를 클릭한다던지, 디버깅에 관한 메시지라던지 그런 것들을요. 그리고 그렇게 주고받는 메시지를 후킹할 수 있는 함수도 제공하고 있습니다. [그림 1] SetWindowsHookEx() 함수의 개요 SetWindowsHookEx() 함수가 그것이죠. [그림 1]처럼 이 함수에 삽입할 DLL의 Handler, 즉 주소와 함수의 주소를…

  • 게임 매크로 Inventory A+ 분석

    1. 기능 소개   [그림 1] Warcraft III 에서의 인벤토리   Inventory A+는 Blizzard 사의 Warcraft III 의 인벤토리 단축키를 변경하는 매크로입니다. 원래 인벤토리의 아이템을 사용하기 위한 단축키는 숫자패드의 7, 8, 4, 5, 1, 2 이지만, Inventory A+ 를 실행하면 인벤토리 단축키가 [그림 2]와 같이 변경됩니다. 실제로 이 매크로는 DotA 용으로 제작된 것입니다.   [그림…

0 Comments

  1. 안녕하세요 SecurityFirst의 대표입니다^^
    재미로 만들어봤던 핸드리버싱이었는데
    멋지게풀이를해주셔서 감사드려요^^
    다음에한번만나뵐 기회가있겟지요?ㅋㅋ

  2. 제가 버스를 타서 핸드레이 디컴파일 작업을 할수 없었던 것이었군요……
    갑자기 제 고향에 기차가 없다는게 슬퍼집니다..

  3. 아뇨 오히려 핸드레이 리버싱이 더 쉽고 재미나요. 특히, 기차 타고 가면서 핸드레이 리버싱하는 낭만이 있죠.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다