728x90
if.exe
코드와 비교해 보자
분석
스택에 임의 변수를 위한 공간 할당
0119300 에 저장되 있는 값을 스택에 저장 후 printf() 함수 호출
[EBP-8] == num의 주소로 추정(?) EAX에 저장
EAX 를 스택에 저장 후 "%d" 스택에 저장
scanf() 함수 호출
CMP 문으로 0x63 과 입력받은 [EBP-8] 값을 비교
JLE : 왼쪽 인자의 값이 오른쪽 인자보다 작거나 같으면 점프
num 이 99 보다 작거나 같으면 return 0; 으로 점프해서 코드 종료
num 이 99 보다 크거나 같으면 printf() 함수 호출 후 종료
if_hard.exe
- main() 함수의 파라미터 값 3개가 push 되는 것을 보고 main() 함수 인것을 유추
- push EAX == envr
- push EDI == argv
- push ESI == argc
- SUB ESP,8
4byte : 스택을 빼 줌으로 변수 공간을 확보
4byte : 카나리 값 확인 을 위한 공간을 확보 - printf () "숫자를 입력하시오<1~100> : " > scanf() 함수 호출
- CMP DWORD PTR SS:[EBP-8],0A
- CMP 입력값 이 들어 있는 [EBP-8] 을 10 과 비교
5 [EBP-8] - 10 를 입력 == C 와 S Flag 변화 - 점프를 하지 않고 그대로 진행 "Not here ~ " 문자열 출력
- CMP 입력값 이 들어 있는 [EBP-8] 을 10 과 비교
- CMP DWORD PTR SS:[EBP-8],0A
- [EBP-8] 12 - 10 == Flag 변화 없음
- 다음 주소로 점프
Jmp 명령어가 있는 곳 바로 위에는 oper를 비교할 cmp 가 존재한다
jmp명령어의 종류 및 flag 들의 변화에 따라 점프의 여부가 정해진다.
이 후 CMP > JMP 명령어 순으로 이어지며 Flag들의 변화로 점프 여부가 정해짐.
정답 : num == 574 !!
코드구현
#include <stdio.h>
int main() {
int num; // SUB ESP,8 임의 변수 명
printf("숫자를 입력하시오<1~100> : ");
// PUSH 12720F0 "숫자를 입력하시오<1~100> : "
// CALL 01271180 printf()
scanf("%d", &num);
// LEA EAX,DWORD PTR SS:[EBP-8] ; PUSH EAX &num
// PUSH 1272110 "%d"
// CALL 012711C0 scanf()
if (num > 10) // CMP DWORD PTR SS:[EBP-8],0A ; JG SHORT 012710C6
{
if (num < 912) //CMP DWORD PTR SS:[EBP-8],390 ; JL SHORT 012710E1
{
if (num != 200) // CMP DWORD PTR SS:[EBP-8],0C8 ; JNZ SHORT 012710F9
{
if (num <= 250) // CMP DWORD PTR SS:[EBP-8],0FA ; JLE SHORT 01271159
{
printf("more harder\n");
return 0;
}else
{
if (num <= 711) // CMP DWORD PTR SS:[EBP-8],2C7 ; JLE SHORT 0127111A
{
if (num > 573 ) // CMP DWORD PTR SS:[EBP-8],23D ; JG SHORT 01271132
{
if (num < 575) // CMP DWORD PTR SS:[EBP-8],23F ; JL SHORT 0127114A
{
printf("oh how can find?\n");
return 0;
}else
{
printf("almost there\n");
return 0;
}
}else
{
printf("you missed it\n");
return 0;
}
} else
{
printf("nop!\n");
return 0;
}
}
}else
{
printf ("try again\n");
return 0;
}
}else
{
printf("no no\n");
return 0;
}
} else
{
printf("NOt here ~\n");
return 0;
}
return 0;
}
'Reversing' 카테고리의 다른 글
Switch.exe / Switch2.exe (0) | 2021.08.26 |
---|---|
Basic_BOF 1 (0) | 2021.08.25 |
Reversing 01. (0) | 2021.07.21 |
리버스 엔지니어링 개요 (0) | 2021.07.20 |