본문으로 바로가기

ASM to C with IDA - 007

category Reversing/ASM to C 2018. 5. 25. 11:02

C300_007



C300_소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h> 
 
main()
{
    char ch;
    unsigned char j;
    char k;
 
    ch = 200;
    j = 200;
    k = 'a';
 
    printf("문자형 변수 i의 값은 %d \n", ch);
    printf("문자형 변수 j의 값은 %u \n", j);
    printf("문자형 변수 k의 값은 %d \n", k);
}
cs



IDA - Layout Graph




IDA - Text View




movzx(move zero extend) - 데이터가 확장될 때 0으로 확장한다. (항상 양수)

movsx(move sign extend) - 데이터가 확장될 때 sign으로 확장한다.


200은 2진수로 1100 1000이다. 

200이 char형으로 선언되었을 때 MSB(최상위 비트)가 1이므로 음수라고 생각한다.

따라서 2의 보수를 취하면 -56이 된다. 따라서 출력을 하면 -56이 출력된다.


200을 unsigned char 형태로 선언하면 MSB를 신경쓰지 않기 때문에 1100 1000을 양수인 데이터로 생각하여 출력한다.


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
#include <stdio.h> 
 
main()
{
    char var_1;
    unsigned char j;
    char k;
 
    var_1 = 200;
    j = 200;
    k = 97;
 
    eax = var_1;
    printf(_Foramt, eax);
 
    ecx = j;
    printf(byte_40303C, ecx);
 
    edx = k;
    printf(byte_403058, edx);
 
    eax = 0;
}
cs



pseudo code - 최종 의사 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
 
main()
{
    char var_1;
    unsigned char j;
    char k;
 
    var_1 = 200;
    j = 200;
    k = 97;
 
    printf(_Foramt, var_1);
 
    printf(byte_40303C, j);
 
    printf(byte_403058, k);
}
cs


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

ASM to C with IDA - 009 (??)  (0) 2018.05.26
ASM to C with IDA - 008  (0) 2018.05.26
ASM to C with IDA - 006  (0) 2018.05.25
ASM to C with IDA - 005  (0) 2018.05.25
ASM to C with IDA - 004  (1) 2018.05.25