본문으로 바로가기

ASM to C with IDA - 039

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

C300_039



C300_소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
 
union tagVariant
{
    int i;
    float d;
};
 
main()
{
    union tagVariant V;
 
    V.i = 0;
    V.d = 5.5;
 
    printf("V.i = %d \n", V.i);    // V.i = 1085276160
    printf("V.d = %f \n", V.d);    // V.d = 5.500000
}
cs



IDA - Layout Graph




IDA - Text View




movss: 4바이트 float 단정도 부동 소수점을 대입(전달)한다.


movsd: SI 또는 ESI 레지스터에 의해 지정된 메모리 주소의 내용을 DI 또는 EDI 레지스터에 의해 저정되는 메모리 주소로 복사한다.


CVTSS2SD(Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value)

단정도 실수형의 스칼라 값을 배정도 실수형의 스칼라 값으로 변환한다.

단정도는 float, 배정도는 double을 의미한다.


처음 C 코드를 보면 union을 이용해 int 와 float가 공통된 메모리를 사용하고 있는것을 볼 수 있다.

하지만 어셈블리로 보면, stack에 올라간 위치를 덮어 쓰면서 같이 사용하는것을 알 수 있다.


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>
 
 
main()
{
    int V;
    double var_C;
 
    V=0;
    xmm0 = 5.5;
    V = 5.5;
    eax = V;
    printf(_Format, eax);
    
    xmm0 = V;
    var_C = xmm0;
    printf(aVDF, var_C);            
 
    eax = 0;
}
cs



pseudo code - 최종 의사코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
 
main()
{
    int V;
    double var_C;
    V = 0
    V = 5.5;
    printf(_Format, V);
    
    var_C = (double)V;
    printf(aVDF, var_C);                    
 
    return 0;
}
cs




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

ASM to C with IDA - 041  (0) 2018.07.08
ASM to C with IDA - 040  (0) 2018.07.06
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 - 036  (0) 2018.07.05