728x90

if.exe

OllyDbg

코드와 비교해 보자

VsCode

분석

스택에 임의 변수를 위한 공간 할당
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() 함수 위치 찾기

  • main() 함수의 파라미터 값 3개가 push 되는 것을 보고 main() 함수 인것을 유추
    • push EAX == envr
    • push EDI == argv
    • push ESI == argc

스택공간확보 > printf() 호출 > scanf()호출

  • SUB ESP,8
    4byte : 스택을 빼 줌으로 변수 공간을 확보
    4byte : 카나리 값 확인 을 위한 공간을 확보
  • printf () "숫자를 입력하시오<1~100> : " > scanf() 함수 호출

분기문
Flag Register 변화 확인

  • CMP DWORD PTR SS:[EBP-8],0A
    • CMP 입력값 이 들어 있는 [EBP-8] 을 10 과 비교
      5 [EBP-8] - 10 를 입력 == C 와 S Flag 변화
    • 점프를 하지 않고 그대로 진행 "Not here ~ " 문자열 출력

Flag Register 변화 확인

  • 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

+ Recent posts