Kamis, 20 Agustus 2015

Reverse Engineering: Tipe Float

...


tipeFloat.c

#include <stdio.h>
#include <float.h>

int main(){
 printf("Storage size for float : %d \n", sizeof(float));
 printf("Minimum float positive value: %E\n", FLT_MIN );
 printf("Maximum float positive value: %E\n", FLT_MAX );
 printf("Precision value: %d\n", FLT_DIG );
 return 0;
}

/* OUTPUT
Storage size for float : 4 
Minimum float positive value: 1.175494E-38
Maximum float positive value: 3.402823E+38
Precision value: 6
*/



tipeFloat.asm

; => ASM from IDA

; Attributes: bp-based frame

; int __cdecl main(int argc, const char **argv, const char **envp)
public main
main proc near

var_8= qword ptr -8

push    rbp
mov     rbp, rsp
sub     rsp, 10h
mov     esi, 4
mov     edi, offset format ; "Storage size for float : %d \n"
mov     eax, 0
call    _printf
mov     rax, 3810000000000000h
mov     [rbp+var_8], rax
movsd   xmm0, [rbp+var_8]
mov     edi, offset aMinimumFloatPo ; "Minimum float positive value: %E\n"
mov     eax, 1
call    _printf
mov     rax, 47EFFFFFE0000000h
mov     [rbp+var_8], rax
movsd   xmm0, [rbp+var_8]
mov     edi, offset aMaximumFloatPo ; "Maximum float positive value: %E\n"
mov     eax, 1
call    _printf
mov     esi, 6
mov     edi, offset aPrecisionValue ; "Precision value: %d\n"
mov     eax, 0
call    _printf
mov     eax, 0
leave
retn
main endp

; => ASM 2 C

; int main(){
; Attributes: bp-based frame
; int __cdecl main(int argc, const char **argv, const char **envp)
public main
main proc near

var_8= qword ptr -8 ; 8 bytes

push    rbp ; 64 bit
mov     rbp, rsp
sub     rsp, 10h ; 16

; printf("Storage size for float : %d \n", sizeof(float))
mov     esi, 4 ; sizeof(float)
mov     edi, offset format ; "Storage size for float : %d \n"
mov     eax, 0 ; ?
call    _printf

; printf("Minimum float positive value: %E\n", FLT_MIN)
mov     rax, 3810000000000000h ; 4039728865751334912
mov     [rbp+var_8], rax ; [rbp+8]
movsd   xmm0, [rbp+var_8] ; xmm0? movsd? (double word (4 byte) operation)
mov     edi, offset aMinimumFloatPo ; "Minimum float positive value: %E\n"
mov     eax, 1 ; sys_exit
call    _printf

; printf("Minimum float positive value: %E\n", FLT_MAX)
mov     rax, 47EFFFFFE0000000h ; 5183643170566569984
mov     [rbp+var_8], rax ; [rbp+8]
movsd   xmm0, [rbp+var_8] ; xmm0?
mov     edi, offset aMaximumFloatPo ; "Maximum float positive value: %E\n"
mov     eax, 1 ; sys_exit
call    _printf

; printf("Precision value: %d\n", FLT_DIG)
mov     esi, 6 ; FLT_DIG
mov     edi, offset aPrecisionValue ; "Precision value: %d\n"
mov     eax, 0 ; ?
call    _printf

; return 0
mov     eax, 0
leave
retn
main endp

Tidak ada komentar:

Posting Komentar