728x90

Hello.exe

OllyDbg 초기

Hello.exe 파일을 OllyDbg 화면에 올려놓고 실행시켜 준다
화면 최상단 module ntdll 을 확인. 아직 hello.exe가 실행되지 않은 상태 확인

module hello

F9를 눌러 module hello 까지 들어온다 (실제 실행 상태)

module hello & cmd

F8 을 누르며 넘기다 보면
main() 함수에서 사용하는 매개변수(파라미터) 확인
main함수의 시작임을 유추할 수 있다.

  • 보통 main함수 시작 전 push를 3번 해준다.
    CALL hello.003E1040 을 지날 때 CMD창에 hello world 가 나타남을 확인
    003E1255 에 BP점을 잡아주고 ctrl + F2 로 재시작 해줌

main() 함수

스택의 base point(기점)를 알려주기 위해 ESP의 값을 EBP에 저장한다.
스택에 Hello.001E3000을 저장하고 동시에 [ESP -4] 되는 것을 알 수 있다
스택에는 001E3000 이라는 값이 저장되어있다

main() 함수 내 printf()함수 실행

CALL hello.001E1060 실행 후 CMD창에 'hello word' 가 나타나는 것으로 봐서
printf() 함수 인것을 유추할 수 있다.

main() 함수

ESP 값에 4를 더해 스택에 더해 printf()함수를 호출하기 위해 push했던 4byte를 해제한다
ESP 와 EBP의 값이 같아진다.
EAX 를 XOR연산을 해 0 값을 return 해준다 ( return 0; )
POP EBP를 통해 스택 최상위의 값을 EBP에 저장한다
이 후 , 이전 호출 주소로 되돌아 간다

#include <stdio.h>

int main (int argc, char* argv[], char* envp[])
{
    printf("hello world");
    return 0;
}

IN_OUT.exe

module IN_OUT

초기화면에서 F9를 눌러 module IN_OUT로 실행
이후 F8을 진행하면서 3개의 push점을 찾음 ( main()함수 시작점으로 유추)
BP점을 잡아주고 함수 내부로 이동

main() 함수

main() 함수 시작 시 스택의 상태
현재 EBP : 0028FACC ESP : 0028FA88
스택 창을 보면 ESP 에 013712FA가 저장되어 있다
main 함수 종료 후 return 주소

printf() 함수 호출

0137300 마우스 오른쪽 클릭 > Fallow in dump 후 Address를 보면 ASCII를 확인 할 수 있음
push 명령을 통해 0137300 을 스택에 저장하고
call printf() 함수를 호출해 '숫자를 입력하시오 : ' CMD 창에 출력

scanf()함수 변수입력

[EBP -4]에 변수 (num ==9) 이 입력되어 저장

printf() 함수

013731C 에는 '입력한 숫자는 %d 입니다.' 문자열 있음
push 명령을 통해 스택에 올림
이전과 같은 printf() 함수

epilogue

원래의 EBP 값을 저장 후 원래의 함수로 Return

#include <stdio.h>

int main() {
    int num; // 임의 변수 

    printf("숫자를 입력하시오 : ");

    scanf("%d", &num);

    printf("입력한 숫자는 %d입니다.", num);

        return 0;

}

'Reversing' 카테고리의 다른 글

Switch.exe / Switch2.exe  (0) 2021.08.26
Basic_BOF 1  (0) 2021.08.25
if.exe ; if_hard.exe  (0) 2021.07.21
리버스 엔지니어링 개요  (0) 2021.07.20

+ Recent posts