본문 바로가기

Reverse Engineering

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

C언어로 if문을 컴파일한 것을 IDA로 분석해보자.

#include <stdio.h>

void main()
{
         int a = 3;
         int b = 5;

         if( a > b)
         {
                 printf(" a 가 크다 ");
         }

         else
         {
                printf(" b 가 크다 ");
         }
}


IDA 그래프 기능으로 본 해당 소스의 흐름이다.


가운데 지점에서 빨간선과 초록선으로 분기하고 각각의 일을 실행한 후 하나로 합쳐지며 프로그램이 종료된다.

.text:00411390                 push    ebp 에 breakpoint를 설정한다.

디버그 모드로 전환(F9)하여 분석을 해보겠다.

다음은 Main함수이다.

.text:00411390 main proc near                          ; CODE XREF: j_mainj
.text:00411390
.text:00411390 var_D8= byte ptr -0D8h          // 변수 선언
.text:00411390 var_14= dword ptr -14h          // 변수 선언 : int b; 
.text:00411390 var_8= dword ptr -8               // 변수 선언 : int a;
.text:00411390
.text:00411390 push    ebp
.text:00411391 mov     ebp, esp
.text:00411393 sub     esp, 0D8h
.text:00411399 push    ebx
.text:0041139A push    esi
.text:0041139B push    edi
.text:0041139C lea     edi, [ebp+var_D8]
.text:004113A2 mov     ecx, 36h
.text:004113A7 mov     eax, 0CCCCCCCCh
.text:004113AC rep stosd
.text:004113AE mov     [ebp+var_8], 3           // 3을 [ebp+var_8]에 대입 : a = 3;
.text:004113B5 mov     [ebp+var_14], 5          // 5을 [ebp+var_14]에 대입 : b = 5;
.text:004113BC mov     eax, [ebp+var_8]       // [ebp+var_8]을 eax에 대입 : eax = 3;
.text:004113BF cmp     eax, [ebp+var_14]     // eax와 [ebp+var_14]를 비교 : (3 : 5 비교)
.text:004113C2 jle     short loc_4113DD     // eax값이 [ebp+var_14]보다 작거나 같으면 점프
                                                              :  3 - 5 < 0  작거나 같으므로 점프

분기 1 :

.text:004113C4 mov     esi, esp
.text:004113C6 push    offset aABI                     ; " a 가 크다 "
.text:004113CB call    ds:__imp__printf
.text:004113D1 add     esp, 4
.text:004113D4 cmp     esi, esp
.text:004113D6 call    j__RTC_CheckEsp
.text:004113DB jmp     short loc_4113F4         // 합쳐지는 코드로 점프
.text:004113DD ; --------------------------------------------------------------------

분기 2 :
.text:004113DD
.text:004113DD loc_4113DD:                             ; CODE XREF: main+32j
.text:004113DD mov     esi, esp
.text:004113DF push    offset aBBI                     ; " b 가 크다 "
.text:004113E4 call    ds:__imp__printf
.text:004113EA add     esp, 4
.text:004113ED cmp     esi, esp
.text:004113EF call    j__RTC_CheckEsp
.text:004113F4

분기후 합쳐지는 코드 :

.text:004113F4 loc_4113F4:                             ; CODE XREF: main+4Bj
.text:004113F4 xor     eax, eax
.text:004113F6 pop     edi
.text:004113F7 pop     esi
.text:004113F8 pop     ebx
.text:004113F9 add     esp, 0D8h
.text:004113FF cmp     ebp, esp
.text:00411401 call    j__RTC_CheckEsp
.text:00411406 mov     esp, ebp
.text:00411408 pop     ebp
.text:00411409 retn
.text:00411409 main endp

몇가지 구문을 C언어로 제작하고, 그것을 역으로 IDA에 넣어서 분석해보며
분석실력과 어셈실력을 익혀놓으면 리버싱 실력향상에 도움이 된다.