Reversing/ASM to C

ASM to C with IDA - 011

MarcoKhan 2018. 5. 27. 20:23

C300_011



C300_소스코드



1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h> 
 
main()
{
    char str[] = "대한민국";
    char *= "I love Korea";
 
    printf("문자열형 변수 str의 값은 %s \n", str);
    printf("문자열형 상수 j의 값은 %s \n", j);
}
 
cs



IDA - Layout Graph






IDA - Text View




우선 dword 값을 보자.


아래와 같이 dword_403020, dword_403024에 어떤 값이 들어가긴 들어가는데 16진수로 되어 있어서 어떤 값이 들어가는지 한 눈에 알 수 없다.

dd 0D1C7EBB4h를 마우스 오른쪽 클릭하거나, 'R'을 누르면 값이 유니코드로 보인다.



유니코드는 한 글자에 2바이트 이다. 따라서 두 글자에 4바이트가 필요하다. 또한 little endian 방식을 사용하고 있어 값의 순서가 바뀌어 들어간다.

byte_403028은 0을 넣어주는데, 이것이 문자열 끝에 항상 존재하는 nul 문자이다.



참고로 security cookie는 bof를 막기 위해 buffer 사이에 생성되는 것인데 SEH를 공부하면 더 자세히 알 수 있다.



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
#include <stdio.h> 
 
main()
{
    int j;
    char str[12];
 
    eax = dword_403020;
    *str = eax; 
 
    ecx = dword_403024;
    *str = ecx;
 
    dl = byte_403028;
    *str+8 = dl;
    j = offset aIloveKorea;
 
    eax = str;
    
    printf(_Format, eax);
 
    ecx=j;
    printf(byte_40305C, ecx);        
 
    eax = 0;
}
cs



j 메모리 공간에 "IloveKorea"를 가르키는 메모리 주소가 저장되어 있다.

따라서 j의 메모리 접근을 통해 "IloveKorea"를 출력할 수 있다.


pseudo code - 최종 의사 코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
 
main()
{
    int *j;
    char str[12];
 
    *str = "대한"
 
    *(str+4= "민국";
 
    *(str+8) = NULL;
    j = "IloveKorea";
    
    printf(_Format, str);
 
    printf(byte_40305C, j);        
}
cs