본문으로 바로가기

ASM to C with IDA - 019

category Reversing/ASM to C 2018. 5. 29. 08:36

C300_019



C300_소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h> 
 
main() 
    int x = 4;
    int y = 2;
    int z;
 
    z = x + y;                // 6 = 4 + 2
    z = x - y;                // 2 = 4 - 2
    z = x * y;                // 8 = 4 * 2
    z = x / y;                // 2 = 4 / 2
    z = (x+y) * (x-y);        // 12 = (4+2) * (4-2)
    z = (x*y) + (x/y);        // 16 = (4*2) + (4/2)
    z = x + y + 2004;        // 2010 = 4 + 2 + 2004        
    z = 2004 - x - y;        // 1998 = 2004 - 4 - 2
cs



IDA - Layout Graph





IDA - Text View





imul

 - 음수를 포함한 수를 곱할 때 사용하는 명령어

 - eax와의 연산만이 아닌 레지스터끼리 곱, eax가 아닌 다른 레지스터와 메모리 곱, 상수와의 곱이 가능하다.

 - 부호 있는 al, ax, eax의 값을 피연산자와 곱한다.


idiv

 - 음수를 포함한 수를 나눌 때 필요한 명령어 

 - 아래 표는 intel 문서를 참고한 것으로 나눌 수는 레지스터에, 나눌 수는 eax에 저장하고 idiv를 실행하면

   일반적으로 eax에 몫, edx에 나머지가 저장된다.



cdq(Convert Dword to Qword): dword 크기를 qword 크기로 확장한다.


lea 

 - lea operand1 operand2 형식으로 사용된다.

 - operand2의 주소를 oeprand1에 저장한다.

 

 ex) lea eax [ebp - 4]

: eax에 ebp - 4가 저장될 것이다.



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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h> 
 
main() 
    int x = 4;
    int y = 2;
    int z;
 
    x = 4;
    y = 2;
    
    eax = x;
    eax = eax + y;
    z = eax;
 
    ecx = x;
    ecx = ecx - y;
    z = ecx;
 
    edx = x;
    edx = edx * y;                                
    z = edx;
 
    eax = x/y;
    z = eax;
 
    eax = x;
    eax = eax + y;
    ecx = x;
    ecx = ecx - y;
    eax = eax * ecx;
    z = eax;
 
    ecx = x;
    ecx = ecx * y;
    eax = x;
    eax = x / y;
    ecx = ecx + y;
    z = ecx;
 
    edx = y;
    eax = x;
    ecx = eax + edx + 2004;
    z = ecx;
 
    edx = 2004;
    edx = edx - x;
    edx = edx - y;
    z = edx;
 
    eax = 0    
cs



pseudo code - 최종 의사 코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h> 
 
main() 
    int x = 4;
    int y = 2;
    int z;
 
    x = 4;
    y = 2;
    
    z = x + y;
    z = x - y;
    z = x * y;
    z = x / y;
    
    z = (x + y) * (x - y):
    z = (x * y) + (x / y);            
    z = x + y + 2004;
    z = 2004 - x - y;
cs


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

ASM to C with IDA - 021  (0) 2018.05.30
ASM to C with IDA - 020  (0) 2018.05.30
ASM to C with IDA - 018  (0) 2018.05.29
ASM to C with IDA - 017  (0) 2018.05.29
ASM to C with IDA - 016  (0) 2018.05.28