본문으로 바로가기

ASM to C with IDA - 009 (??)

category Reversing/ASM to C 2018. 5. 26. 13:06

C300_009



C300_소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h> 
 
main()
{
    float d;
    double d1;
    double d2;
 
    d = 3.141592;
    d1 = 1234567890;
    d2 = 'c';
 
    printf("실수형 변수 d의 값은 %E \n", d);
    printf("실수형 변수 d1의 값은 %E \n", d1);
    printf("실수형 변수 d2의 값은 %E \n", d2);            
}
cs



IDA - Layout Graph




IDA - Text View





__real@에 들어가 있는 값들을 보면 아래와 같다.



movss : 부동 소수를 옮길 사용하는 명령어

(Merge Scalar Single-Precision Floating Pointing-Point Value)

단정도 부정소수(32비트)


movsd: 부동 소수를 옮길 사용하는 명령어

(Merge Scalar Double-Precision Floating Pointing-Point Value)

배정도 부정소수(64비트)


cvtss2sd(단정도 실수 -> 배정도 실수): 형변환

(Convert Doubleword Interger to Scalar Double-Precision Floating-Point Value)


xmm0 레지스터(128 bit)

부동 소수점 관련 연산을 할 때 사용된다.


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
#include <stdio.h> 
 
main()
{
    int d;
    double d1;
    double d2;
    double var_1C;
 
    xmm0 = 3.141592;
    d = xmm0;
    
    xmm0 = 1.233456789e9;
    d1 = xmm0;
 
    xmm0 = 99.0;
    d2 = xmm0;
 
    xmm0 = d;  // 형 변환 4byte -> 8byte
 
    [esp+1Ch+var_1C] = xmm0
    printf(_Format, [esp+1Ch+var_1C]);
 
    xmm0 = d1;
    [esp+1Ch+var_1C] = xmm0;
    pritnf(byte_40303C, [esp+1Ch+var_1C]);
 
    xmm0 = d2;
    [esp+1Ch+var_1C] = xmm0;
    pritnf(byte_403058, [esp+1Ch+var_1C]);                    
 
    eax = 0;            
}
cs



소수는 메모리에 저장될수 없어 xmm0 레지스터에 저장한 후 printf의 서식문자에 의해 xmm0를 참조해 출력하는것 같다.


[esp+1Ch+var_1C] 가 가리키는 곳이 정확히 어디일까??

이부분을 잘 모르겠다...ㅠ


float를 print 할 때 8byte로 바꿔서 하는 부분이 있다. (19줄)  이부분도 ?? 고민?




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
#include <stdio.h> 
 
main()
{
    int d;
    double d1;
    double d2;
    double var_1C;
 
    d = 3.141592;
    
    d1 = 1.233456789e9;
 
    d2 = 99.0;
 
    xmm0 = d;  // 형 변환 4byte -> 8byte
 
    printf(_Format, d);
 
    printf(byte_40303C, d1);
 
    printf(byte_403058, d2);                    
        
}
cs


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

ASM to C with IDA - 011  (0) 2018.05.27
ASM to C with IDA - 010(??)  (0) 2018.05.26
ASM to C with IDA - 008  (0) 2018.05.26
ASM to C with IDA - 007  (0) 2018.05.25
ASM to C with IDA - 006  (0) 2018.05.25