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 |