본문으로 바로가기

ASM to C with IDA - 036

category Reversing/ASM to C 2018. 7. 5. 10:14

C300_036



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
25
#include <stdio.h> 
 
main()
{
    int saram_A = 0;
    int saram_B = 0;
    int* pointer;
    int* psaram;
 
    pointer = &saram_A;
    *pointer = 1;
    printf("%d, %d \n", saram_A, *pointer);        // 1, 1
 
    psaram = &saram_A;
    *psaram = 2;
    printf("%d, %d, %d \n", saram_A, *pointer, *psaram);    // 2, 2, 2
 
    pointer = &saram_B;
    *pointer = 3;
    printf("%d, %d, %d \n", saram_A, saram_B, *pointer);    // 2, 3, 3
 
    psaram = &saram_B;
    *psaram = 4;                                            
    printf("%d, %d, %d, %d\n", saram_A, saram_B, *pointer, *psaram);    // 2, 4, 4, 4
}
cs



IDA - Layout Graph




IDA - Text View




psaram 과 pointer에는 이름으로 미루어보아 포인터로 사용됨을 유추해 볼 수도 있지만,

lea를 통해 다른 변수의 주소를 받고 이 주소를 이용해 값에 접근하는것을 보고 포인터임을 알 수 있다.


[ ] 를 통해 주소에 대한 값에 접근할 수 있다.


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
53
54
55
56
#include <stdio.h> 
 
main()
{
    int *pointer;
    int saram_A;
    int *psram;
    int saram_B;
 
    saram_A=0;
    saram_B=0;
 
    eax = &saram_A;
    pointer = eax;
    ecx    = pointer;
    [ecx] = 1;
    edx = pointer;
    eax = [edx];
    ecx = saram_A;
    printf(_Format, ecx, eax);        // 1, 1
 
    edx = &saram_A;
    psaram = edx;
    eax = psaram;
    [eax] = 2;
    ecx = psaram;
    edx = [ecx];
    eax = pointer;
    ecx = [eax];
    edx = [saram_A];
    printf(aDDDD, edx, ecx, edx);    // 2, 2, 2
 
    eax = &saram_B;
    pointer = eax;
    ecx = pointer;
    [ecx] = 3;
    edx = pointer;
    eax = [edx];
    ecx = saram_B;
    edx = saram_A;
    printf(aDDD_0, edx, ecx, eax);    // 2, 3, 3
 
    eax = &saram_B;
    psaram = eax;
    ecx = psaram;
    [ecx] = 4;
    edx = psaram;
    eax = [edx];
    ecx = pointer;
    edx = [ecx];
    eax = [saram_B];
    ecx = [saram_A];
    pirntf(ecx, eax, edx, eax);    // 2, 4, 4, 4 
    
    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
22
23
24
25
26
27
28
29
30
#include <stdio.h> 
 
main()
{
    int *pointer;
    int saram_A;
    int *psram;
    int saram_B;
 
    saram_A=0;
    saram_B=0;
 
    pointer= &saram_A;
    *pointer = 1
    printf(_Format, saram_A, *pointer);        // 1, 1
 
    psaram = &saram_A;
    *psaram = 2
    printf(aDDDD, saram_A, *pointer, *psaram);    // 2, 2, 2
 
    pointer = &saram_B;
    *pointer = 3;
    printf(aDDD_0, saram_A, saram_B, *pointer);    // 2, 3, 3
 
    psaram = &saram_B;
    *psaram = 4;
    pirntf(saram_A, saram_B, *pointer, *psaram);    // 2, 4, 4, 4 
    
    return 0;
}
cs








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

ASM to C with IDA - 038  (0) 2018.07.06
ASM to C with IDA - 037  (0) 2018.07.05
ASM to C with IDA - 035  (0) 2018.07.05
ASM to C with IDA - 034  (0) 2018.07.04
ASM to C with IDA - 033  (0) 2018.07.04