본문으로 바로가기

ASM to C with IDA - 052 (strcpy)

category Reversing/ASM to C 2018. 7. 11. 11:02

C300_052  



C300_소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
 
#define KOREA    "대한민국"
 
void main(void)
{
    char *string1;
    char string2[100];
 
    strcpy(string1, KOREA);
    strcpy(string2, KOREA);
    strcpy(string2, "봄");
}
 
cs



IDA - Layout Graph





IDA - Text View



한글은 유니코드를 사용하고 있다. 유니코드는 한글자에 2바이트이다.

효율성을 위해 strcpy는 한번에 4바이트 씩, 2글자 씩 옮기고 있다.

또한 string의 맨 마지막에 NULL을 붙여 끝을 명시해준다.


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
#include <stdio.h>
 
void main(void)
{
    int *string1;
    char string2[100];    
 
    eax = string1;
    ecx = dword_403030;
    [eax] = ecx;
    edx = dword_403034;
    [eax+4= ecx;
    cl = dword_403038
    [eax+8= cl;
 
    edx = dword_403024;
    [string2] = edx;
    eax = dword_403028;
    [string2+4= eax;
    cl = byte_40302C;
    [string2+8= cl;
 
    dx = word_403020;
    [string2] = dx;
    al = byte_403022;
    [string2+2= al;
    
    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
#include <stdio.h>
 
void main(void)
{
    int *string1;
    char string2[100];    
 
    [string1] = dword_403030;
    [string1+4= dword_403034;
    [string1+8= dword_403038;
 
    [string2] = dword_403024;
    [string2+4= dword_403028;
    [string2+8= byte_40302C;
 
    [string2] = word_403020;
    [string2+2= byte_403022;
    
    return 0;
cs



dword_403030 = "대한"

dword_403034 = "민국"

dword_403048 = NULL


dword_403024 = "대한"

dword_403028 = "민국"

dword_40302C= NULL


dword_403020 = "봄"

dword_403022 = NULL


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

ASM to C with IDA - 054 (strcmp)  (0) 2018.07.12
ASM to C with IDA - 053  (0) 2018.07.12
ASM to C with IDA - 051  (0) 2018.07.11
ASM to C with IDA - 050  (0) 2018.07.11
ASM to C with IDA - 049  (0) 2018.07.10