일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준
- 티스토리
- 함수
- Win32
- doit코틀린프로그래밍
- tipssoft
- Kotlin
- c++
- 연산자
- Tips강좌
- c#
- Desktop
- Tips프로그래밍강좌
- 김성엽
- Direct2D
- c
- 프로그래밍
- 지식나눔강좌
- 이지스퍼블리싱
- CS
- Javascript
- Windows
- 배열
- VS ERROR
- 포인터
- 리뷰
- Visual Studio
- 문법
- 알고리즘
- Programming
Archives
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
[C300] : C004 본문
반응형
#include <stdio.h>
main()
{
int x;
int y;
x = 10;
y = x - 5;
if( x > y )
{
printf( "x의 값이 y보다 큽니다." );
}
else
{
printf( "x의 값이 y보다 작습니다." );
}
}
위 코드를 분석한다.
처음 IDA에 올리면 아래 코드가 나온다.
보면, 분기구문이 있으므로, if문이 있다고 보여진다.
코드를 보면 일단, 10과 5를 넣는것을 알 수 있다. (실수로 [401093]까지 블럭을 씌워야 하는데, 못했다. 귀찮아서 수정은 안함)
이 코드에서 ecx 레지스터와 스택에 들어있는 값을 비교한다. 즉, 스택에 들어있는 10과 5를 비교한다고 볼 수 있다.
cmp 명령어는 결과가 -가 나오면 CF가 1로, 0이면 ZF가 1로 설정된다.
따라서 일차적으로 의사코드를 생성하면 다음과 같다.
#include <stdio.h>
int main(void){
int x = 10;
int y = x - 5;
if( x > y ){
printf(_Format);
}else{
printf(asc_403018);
}
return 0;
}
jle는 JUMP LESS OR EQUAL 이다. C에서 작성한 것은 컴파일 과정에서 <= 는 >, < 는 >= 등 반대로 된다고 한다. 따라서 x <= y 이므로, C 코드에서는 >이 맞다.
포맷을 살펴보면 다음과 같다.
따라서 최종 의사코드는 다음과 같다.
#include <stdio.h>
int main(void) {
int x, y;
x = 10;
y = x - 5;
if (x > y) {
printf("x의 값이 y보다 큽니다.");
}
else {
printf("x의 값이 y보다 작습니다.");
}
return 0;
}
참고
>> 상수 비교가 아니라 변수 비교임을 알 수 있는 이유는 스택에 쌓여 변수의 사용 과정과 같이 쓰였기 때문이다. 상수비교의 경우 단순히 값을 비교하면 되는데 이번 ASM코드에는 상수 비교 루틴이 아닌 변수 비교 루틴이 사용되어 변수 두 개를 사용했다고 보았다.
>> JLE 등 점프 분기문 : https://blog.naver.com/67sooon/10166748134 하단 참고
728x90
반응형
'리버싱 > C300' 카테고리의 다른 글
[C300] : C003 (0) | 2018.09.25 |
---|---|
[C300] : C002 (0) | 2018.09.23 |
[C300] : C001 (0) | 2018.09.22 |
Comments