C언어로 for문을 컴파일한 것을 IDA로 분석해보자.
#include <stdio.h>
int main(void)
{
int i = 0;
int result = 0;
for ( i ; i < 5 ; i++ )
{
result = i;
}
}
IDA 그래프 기능으로 본 해당 소스의 전체적인 흐름이다.
가운데 지점에서 빨간선과 초록선으로 분기를 하고 초록선으로 이동하면 일을 수행후 종료가 되며 빨간선으로 이동하면 일을 수행한 후 다시 돌아온다.
.text:00411360 push ebp 에 breakpoint를 설정한다.
(Tip : 디어셈블된 상태에서 분석할 때 마우스로 함수를 더블클릭(Enter)하면 함수 안으로 들어갈수 있다. 함수를 선택후 Alt+Enter을 누르면 새 창이 뜨면서 그래프로 함수의 내용을 보여준다)
디버그 모드로 전환(F9)하여 분석을 해보겠다.
다음은 Main함수이다.
.text:00411360 main proc near ; CODE XREF: j_mainj
.text:00411360
.text:00411360 var_D8= byte ptr -0D8h // 변수 선언
.text:00411360 var_14= dword ptr -14h // 변수 선언 : int result;
.text:00411360 var_8= dword ptr -8 // 변수 선언 : int i;
.text:00411360
.text:00411360 push ebp
.text:00411361 mov ebp, esp
.text:00411363 sub esp, 0D8h
.text:00411369 push ebx
.text:0041136A push esi
.text:0041136B push edi
.text:0041136C lea edi, [ebp+var_D8]
.text:00411372 mov ecx, 36h
.text:00411377 mov eax, 0CCCCCCCCh
.text:0041137C rep stosd
.text:0041137E mov [ebp+var_8], 0 // [ebp+var_8] 에 0을 대입 : i = 0
.text:00411385 mov [ebp+var_14], 0 // [ebp+var_14]에 0을 대입 : result = 0
.text:0041138C jmp short loc_411397 // loc_411387로 점프
: int i = 0; , int result = 0;
.text:0041138E ; --------------------------------------------------------------------
.text:0041138E
.text:0041138E loc_41138E: ; CODE XREF: main+43j
.text:0041138E mov eax, [ebp+var_8] // [ebp+var_8]값을 eax에 대입
.text:00411391 add eax, 1 // eax+=1
.text:00411394 mov [ebp+var_8], eax // eax값을 [ebp+var_8]에 대입
: i++
.text:00411397
.text:00411397 loc_411397: ; CODE XREF: main+2Cj
.text:00411397 cmp [ebp+var_8], 5 // i와 5를 비교
.text:0041139B jge short loc_4113A5 // [ebp+var_8]이 5보다 크거나 같으면 4113A5 점프
.text:0041139D mov eax, [ebp+var_8] // [ebp+var_8]값을 eax에 대입
.text:004113A0 mov [ebp+var_14], eax // eax값을 [ebp+var_14]에 대입
.text:004113A3 jmp short loc_41138E // 41138E로 점프
: i < 5 비교 만족하면 result = i; 만족하지 않으면 4113A5로 점프
for()문이 있는 프로그램을 디버깅했다. while()문도 for()문과 같은 작동을 하는 코드를 작성하여 IDA로 열면 비슷한 디어셈블 결과를 볼 수 있을 것이다.
#include <stdio.h>
void main()
{
int i = 0;
int result = 0;
while(i<5)
{
result = i;
i++;
}
}
#include <stdio.h>
int main(void)
{
int i = 0;
int result = 0;
for ( i ; i < 5 ; i++ )
{
result = i;
}
}
IDA 그래프 기능으로 본 해당 소스의 전체적인 흐름이다.
가운데 지점에서 빨간선과 초록선으로 분기를 하고 초록선으로 이동하면 일을 수행후 종료가 되며 빨간선으로 이동하면 일을 수행한 후 다시 돌아온다.
.text:00411360 push ebp 에 breakpoint를 설정한다.
(Tip : 디어셈블된 상태에서 분석할 때 마우스로 함수를 더블클릭(Enter)하면 함수 안으로 들어갈수 있다. 함수를 선택후 Alt+Enter을 누르면 새 창이 뜨면서 그래프로 함수의 내용을 보여준다)
디버그 모드로 전환(F9)하여 분석을 해보겠다.
다음은 Main함수이다.
.text:00411360 main proc near ; CODE XREF: j_mainj
.text:00411360
.text:00411360 var_D8= byte ptr -0D8h // 변수 선언
.text:00411360 var_14= dword ptr -14h // 변수 선언 : int result;
.text:00411360 var_8= dword ptr -8 // 변수 선언 : int i;
.text:00411360
.text:00411360 push ebp
.text:00411361 mov ebp, esp
.text:00411363 sub esp, 0D8h
.text:00411369 push ebx
.text:0041136A push esi
.text:0041136B push edi
.text:0041136C lea edi, [ebp+var_D8]
.text:00411372 mov ecx, 36h
.text:00411377 mov eax, 0CCCCCCCCh
.text:0041137C rep stosd
.text:0041137E mov [ebp+var_8], 0 // [ebp+var_8] 에 0을 대입 : i = 0
.text:00411385 mov [ebp+var_14], 0 // [ebp+var_14]에 0을 대입 : result = 0
.text:0041138C jmp short loc_411397 // loc_411387로 점프
: int i = 0; , int result = 0;
.text:0041138E ; --------------------------------------------------------------------
.text:0041138E
.text:0041138E loc_41138E: ; CODE XREF: main+43j
.text:0041138E mov eax, [ebp+var_8] // [ebp+var_8]값을 eax에 대입
.text:00411391 add eax, 1 // eax+=1
.text:00411394 mov [ebp+var_8], eax // eax값을 [ebp+var_8]에 대입
: i++
.text:00411397
.text:00411397 loc_411397: ; CODE XREF: main+2Cj
.text:00411397 cmp [ebp+var_8], 5 // i와 5를 비교
.text:0041139B jge short loc_4113A5 // [ebp+var_8]이 5보다 크거나 같으면 4113A5 점프
.text:0041139D mov eax, [ebp+var_8] // [ebp+var_8]값을 eax에 대입
.text:004113A0 mov [ebp+var_14], eax // eax값을 [ebp+var_14]에 대입
.text:004113A3 jmp short loc_41138E // 41138E로 점프
: i < 5 비교 만족하면 result = i; 만족하지 않으면 4113A5로 점프
for()문이 있는 프로그램을 디버깅했다. while()문도 for()문과 같은 작동을 하는 코드를 작성하여 IDA로 열면 비슷한 디어셈블 결과를 볼 수 있을 것이다.
#include <stdio.h>
void main()
{
int i = 0;
int result = 0;
while(i<5)
{
result = i;
i++;
}
}
'Reverse Engineering' 카테고리의 다른 글
아이다(IDA)의 크로스레퍼런스 기능 - 지뢰찾기 맵핵 (6) | 2009.11.06 |
---|---|
아이다(IDA)의 Debugging - IF문 분석 (0) | 2009.11.06 |
아이다(IDA)의 Debugging - Stack 분석 (0) | 2009.11.04 |
리버싱 수행단계 (1) | 2009.10.31 |
올리디버거(OllyDBG)를 이용한 nag 제거와 윈도우 PE 구조 문제 풀이 (0) | 2009.10.29 |