00. 개요
한동안 리버싱에 손을 떼었다가 다시 시작하려니 엄두가 나질 않는다..
기초 서적의 이론을 다시 한번 살펴보면서 감도 되찾을겸
C로 작성된 프로그램을 리버싱하여 C 코드로 복원을 시키는 작업을 하고자 한다.
※ 복원할 프로그램은 보안을 교육하는 학원에서 사용하는 프로그램으로 파일은 공개하지 않겠다.
Variable 01_01
[그림 1 Variable 01_01 문제]
[그림 1]은 Variable 01_01 문제로 Main 함수의 구간으로 들어간후 캡쳐를 한 화면이다.
간단히 코드에 대해 분석해보도록 하자.
00401000 PUSH EBP
00401001 MOV EBP,ESP
00401003 SUB ESP,0C ; 0x0C, 12 Byte 공간 할당 -> int 형 변수 3개, int n1, n2, n3;
00401006 MOV DWORD PTR SS:[EBP-C],5 ; n1 = 5;
0040100D MOV DWORD PTR SS:[EBP-4],6 ; n2 = 6;
00401014 MOV EAX,DWORD PTR SS:[EBP-C] ; ①
00401017 ADD EAX,DWORD PTR SS:[EBP-4] ; ②
0040101A MOV DWORD PTR SS:[EBP-8],EAX ; n3 = 연산의 결과
0040101D PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040101F PUSH 01_01_Qu.00405030 ; |Title = "Hi RCE"
00401024 PUSH 01_01_Qu.00405038 ; |Text = "Count of Variable?"
00401029 PUSH 0 ; |hOwner = NULL
0040102B CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
00401031 XOR EAX,EAX ; ③
00401033 MOV ESP,EBP
00401035 POP EBP
00401036 RETN 10
①② 이전에 Stack 공간에 0x0C 만큼의 공간을 할당하였는데 Stack 에서는 연산을 할수 없기 때문에 우선적으로 레지스터에 그값을 저장하고 연산 후 그 결과를 Stack 으로 옮기게 된다.
③ EAX 레지스터에는 일반적으로 함수의 반환 값이 들어가게 되는데 XOR 연산은 같은 값일 때 0x00 이 되므로 0을 반환하기 위한 값을 만드는 과정이다.
이 분석을 기반으로 실제 C 코드를 작성해보도록 하겠다.
'Security > RCE' 카테고리의 다른 글
RCE 입문 문서 by Dennis Yurichev (0) | 2014.05.11 |
---|---|
windbg symbol path 및 명령어 (0) | 2014.02.19 |
Solution_Lena 08 (0) | 2013.11.30 |
Solution_Lena 07 (0) | 2013.11.30 |
Solution_Lena 06 (0) | 2013.11.30 |