본문으로 바로가기

ASM to C with IDA - 015

category Reversing/ASM to C 2018. 5. 28. 10:39

C300_015



C300_소스코드



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
#include <stdio.h> 
 
#define TRUE    1
#define FALSE    0
 
main() 
    if( TRUE )
    {
        printf"TRUE의 값은 참입니다. \n" );
    }
    else
    {
        printf"TRUE의 값은 거짓입니다. \n" );
    }
 
    if( FALSE )
    {
        printf"FALSE의 값은 참입니다. \n" );
    }
    else
    {
        printf"FALSE의 값은 거짓입니다. \n" );
    }
cs



IDA - Layout Graph






IDA - Text View





test 명령어:

두 피연산자 사이에 AND 연산을 수행해서 플레그 레지스터에만 영향을 주고 결과 값은 버린다.

OF, CF는 항상 0으로 세팅되고, TEST 연산 결과 값이 0이면 ZF=1, 결과 값이 0이 아니면 ZF=0으로 세팅된다.

두 피연산자끼리 비트 연산인 AND 연산을 수행하므로 피 연산자가 0인지, 0이 아닌지가 중요하다.


jz 명령어:

연산 결과가 0일 때(같을 때), 즉, ZF=1일 때 점프한다.



XOR 명령어를 통해서 flag에 영향을 미칠 수 있다. 아래는 intel 문서에서 발췌했다.


olly dbg로 확인해 본 결과 xor 의 결과가 0일 때 ZF=1로 세팅된다.

xor의 결과가 0이 아니면 ZF=0으로 세팅된다.




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() 
{
     eax = 1;
    
    if(eax == 0)
        printf(aTrue);
    else
        printf(_Format);
 
    ecx=0;
    
    if(ecx == 0)
        printf(aFalse_0);
    else    
        printf(aFalse);        
 
    eax = 0;    
}
cs



pseudo code - 최종 의사 코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h> 
 
main() 
{    
    if(1)
        printf("True의 값은 참 입니다.");
    else
        printf("True의 값은 거짓 입니다.");
 
    if(0)
        printf("False의 값은 참 입니다.");
    else    
        printf("False의 값은 거짓 입니다.");        
}
cs


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

ASM to C with IDA - 017  (0) 2018.05.29
ASM to C with IDA - 016  (0) 2018.05.28
ASM to C with IDA - 014(??)  (0) 2018.05.28
ASM to C with IDA - 013  (0) 2018.05.27
ASM to C with IDA - 012  (0) 2018.05.27