본문으로 바로가기

ASM to C with IDA - 010(??)

category Reversing/ASM to C 2018. 5. 26. 14:22

C300_010



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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h> 
 
main() 
    int b;
    int j;
 
    b = 10 > 5;
    j = 10 > 20;
 
    printf"논리형 변수 b의 값은 %d \n", b );
    printf"논리형 변수 j의 값은 %d \n", j );
 
    if( b )        // 참
    {
        printf"10 > 5의 식은 참입니다. \n" );
    }
    else
    {
        printf"10 > 5의 식은 거짓입니다. \n" );
    }
 
    if( j )        // 거짓
    {
        printf"10 > 20의 식은 참입니다. \n" );                    
    }
    else
    {
        printf"10 > 20의 식은 거짓입니다. \n" );
    }
 
    if-1 )    // 참
    {
        printf"-1은 참입니다. \n" );
    }
    else
    {
        printf"-1은 거짓입니다. \n" );
    }
 
cs



IDA - Layout Graph





IDA - Text View





jz : 두 값이 같으면 점프(zf=1)

OR 명령어에 의해 zf가 설정될 수 있다. 만일 두 operand가 같으면 zf=1로 설정된다.


10 > 5, 10 > 20 과 같이 비교문은 우선적으로 참인지 거짓인지 판별해 참이면 1, 거짓이면 0이 된다.


intel 문서를 보면 OR 명령어가 flag에 영향을 미칠 수 있는데 어떤 조건일 때 영향을 미치는지 자세하게 기술되어 있지 않다.


or edx, 0FFFFFFFFh 를 집중해서 보자.

여기서 cmp 문이 없이 zf가 설정되었는데 어떻게 or 명령어가.. zf를 건드리지?

또한 edx에 무슨 값이 있는지 모르는데??



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 b;
    int j;
 
    b = 1;
    j = 0;
    
    eax = b;
    printf(_Format, eax);
 
    ecx = j;
    printf(_Format, ecx);
 
    if(b==0)
        printf(a105_0);
    else
        printf(a105);
 
    if(j==0)
        printf(a1020_0);                
    else
        printf(a1020);
 
    if(-1)
        printf(a1_0)
    else
        printf(loc_40111B);
    
    eax = 0;    
cs




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
#include <stdio.h> 
 
main() 
    int b;
    int j;
 
    b = 1;
    j = 0;
    
    printf(_Format, b);
 
    printf(_Format, j);
 
    if(b==0)
        printf(10>5의 식은 거짓 입니다.);
    else
        printf(10>5의 식은 참 입니다.);
 
    if(j==0)
        printf(10>20의 식은 거짓 입니다.);                
    else
        printf(10>20의 식은 참 입니다.);
 
    if(-1)
        printf(-1은 참 입니다.)
    else
        printf(-1은 거짓 입니다.);    
cs




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

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