본문 바로가기

Security/RCE

[코드 복원] Variable 01_01

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