Reverse Engineering
올리디버거(OllyDBG)의 Executable Modules 을 통한 문제풀이
Dakuo
2010. 7. 18. 23:54
올리디버거 창들 중에 Executable Modules 창이 있다.
현재 불러온 프로세스에서 실행중인 모듈들을 보여준다.
한 프로그램에서 여러개의 모듈(ex. DLL 등)을 사용할 경우
올리디버거는 하나의 모듈만을 트레싱할 수 있기 때문에 제대로 분석할수가 없다.
따라서 Executable Modules 창을 이용해 실행 가능한 모듈을 골라서 중요한 코드에
BreakPoint 를 걸어놓음으로써 해당 코드가 실행될 때에 제어권을 올리디버거로 받아 문제를 해결할 수 있다.
일단 해당문제를 실행시켜보자.
Ezbeat 문제 패스워드 찾기
올바른 패스워를 찾으시오!
난이도 : ★☆☆☆☆
위의 메시지 박스가 뜨며 확인을 누르면
콘솔창 하나가 뜨며 Input Password : 를 입력하라고 뜬다.
올리디버거로 프로그램을 오픈한다.
메시지 박스가 뜨므로 back to user mode 를 이용한다.
Run(F9)을 한다. 메시지 박스가 뜨면 pause(F12)를 한다.
back to user mode(Alt + F9)를 한 후 확인창을 누른다.
그러면 다음과 같은 코드로 이동한다.
00401149 |. 57 PUSH EDI ; /Style
0040114A |. 68 5CD34000 PUSH CrackMe_.0040D35C ; |E
0040114F |. 68 80D34000 PUSH CrackMe_.0040D380 ; |Text = "올바른 패스워드를 찾으시오!.
난이도 : ★☆☆☆☆"
00401154 |. 51 PUSH ECX ; |hOwner
00401155 |. FF15 4CC14000 CALL DWORD PTR DS:[<&USER32.MessageBoxW>>; \MessageBoxW
0040115B |. 6A 03 PUSH 3 ; /ShowState = SW_SHOWMAXIMIZED
0040115D |. 68 40D34000 PUSH CrackMe_.0040D340 ; |c:\solve.exe
00401162 |. FF15 18C04000 CALL DWORD PTR DS:[<&KERNEL32.WinExec>] ; \WinExec
위의 코드를 보면 WinExec 라는 WinAPI 가 보인다.
이 WinExec 함수는 CreateProcess 와 같이 프로세스를 생성하는 함수이다.
따라서 위의 3줄을 해석해보면
WinExec 함수를 사용하여 최대창으로(SW_SHOWMAXIMIZED) c:\solve.exe 를 실행시켜라라는 뜻이다.
즉, 우리는 분석하던 CrackMe_2.exe 프로세스가 아니라 solve.exe 프로세스를 분석해야 한다.
따라서 WinExec 함수까지 실행을 한후에 solve.exe 가 실행되면
Attach 로 solve.exe 프로세스를 올리디버거로 불러온다.
E창을 눌러 Executable Modules 창을 연다.
맨 위의 solve 를 클릭한다. 실행영역에 올라온 코드들이다.
조금 아래로 가서 살펴보면
0040105C . 68 3CD34000 PUSH solve.0040D33C ; ASCII "Input Password : "
00401061 . E8 28020000 CALL solve.0040128E
00401066 . 83C4 08 ADD ESP,8
00401069 . E8 2F030000 CALL solve.0040139D
0040106E . 50 PUSH EAX
0040106F . 6A 63 PUSH 63
00401071 . 8D55 90 LEA EDX,DWORD PTR SS:[EBP-70]
00401074 . 52 PUSH EDX
00401075 . E8 69070000 CALL solve.004017E3
0040107A . 83C4 0C ADD ESP,0C
0040107D . 6A 0E PUSH 0E
정답으로 보이는 값이 보인다.
입력하면 congratulation~! 가 출력된다.