본문으로 바로가기

ASM to C with IDA - 006

category Reversing/ASM to C 2018. 5. 25. 09:40

C300_006



C300_소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h> 
 
int hapf(int value);
 
main()
{
    printf("1부터   10까지의 합은 %d \n", hapf(10));
    printf("1부터  100까지의 합은 %d \n", hapf(100));
    printf("1부터 1000까지의 합은 %d \n", hapf(1000));
}
 
int hapf(int value)
{
    int i;
    int hap = 0;
 
    for (i = 1; i <= value; i = i + 1)
    {
        hap = hap + i;
    }
 
    return hap;
}
 
cs



IDA - Layout Graph



IDA - Text View



우선 처음 Layout Graph, Text View를 보면 함수가 쓰였다는 느낌을 직관적으로 느껴지지 않을 수도 있다.

하지만 call _hapf 를 집중해서 보자. call이란 것은 어떤 것(함수)을 호출한다는 뜻이다.

즉, _hapf 라는 것(함수)을 호출한다. 그렇다면 함수 내용은 어디에 표현되어 있을까? 

그것은 우선 main 함수를 뜯어 본 후 천천히 찾아보자.


pseudo code main - 의사코드


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h> 
 
main()
{
    _hapf(10);
    printf(_Format, eax);
 
    _hapf(100);
    printf(a1, eax);
 
    _hapf(1000);
    printf(a1_0, eax);
}
cs


main 함수는 작성되었으니 이제 _hapf 함수를 찾아가보자.

_hapf에 마우스를 가져다 대고 double click을 하면 _hapf 함수로 들어갈 수 있다.


_hapf 함수가 IDA로 보여지는 상태를 보자.


IDA - Layout Graph(_hapf)




IDA - Text View(_hapf)




Layout Graph를 보면 <005>에서 보았던 비슷한 형식으로 반복된다는 것을 이제 한눈에 알아차릴 수 있다.

또한 일반적으로 eax는 함수가 끝나고 return 값이 저장되는 register이므로 알아두는것이 좋다.

여기서 알아두면 좋을것은 _cdecl이다.

_cdecl은 호출 규약으로서, _cdecl, _fastcall, _thiscall, _stdcall 이렇게 일반적으로 4개가 존재한다.

나머지 호출규약은 나올때마다 설명하고 우선 _cdecl부터 알아보자.


_cdecl은 함수를 호출한 곳에서 (함수 밖에서) 사용된 stack을 정리한다.

즉, main을 보면 call _hapf를 할 때마다 add esp, 4를 하는데 이것이 main(함수를 호출한 곳)에서 stack을 정리하는 것이다.


각 string을 보는 방법은 누차 설명했으므로 이제부터 생략한다.


pseudo code _hapf - 의사코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h> 
 
int hapf(value)
{
    int hap = 0;
    int i=1;
    
    for(i=1; i<value; i++)
    {
        hap = hap + i;
    }
 
    return hap;        
}
cs



pseudo code - 최종 의사 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h> 
 
int hapf(value)
{
    int hap = 0;
    int i=1;
    
    for(i=1; i<value; i++)
    {
        hap = hap + i;
    }
    return hap;        
}
 
main()
{
    _hapf(10);
    printf(_Format, eax);
 
    _hapf(100);
    printf(a1, eax);
 
    _hapf(1000);
    printf(a1_0, eax);
}
cs


'Reversing > ASM to C' 카테고리의 다른 글

ASM to C with IDA - 008  (0) 2018.05.26
ASM to C with IDA - 007  (0) 2018.05.25
ASM to C with IDA - 005  (0) 2018.05.25
ASM to C with IDA - 004  (1) 2018.05.25
ASM to C with IDA - 003  (0) 2018.05.24