본문 바로가기

Reverse Engineering

아이다(IDA)의 Debugging - FOR문 분석

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++;
        }
}