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 |