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

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에 넣어서 분석해보며
분석실력과 어셈실력을 익혀놓으면 리버싱 실력향상에 도움이 된다.

덧글

댓글 입력 영역


통계 위젯 (블랙)

312
39
54946

블로그 랭킹 위젯

마우스오른쪽금지