Reverse Engineering
아이다(IDA)의 Debugging - IF문 분석
Dakuo
2009. 11. 6. 00:33
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에 넣어서 분석해보며
분석실력과 어셈실력을 익혀놓으면 리버싱 실력향상에 도움이 된다.