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 |