Hello.exe
Hello.exe 파일을 OllyDbg 화면에 올려놓고 실행시켜 준다
화면 최상단 module ntdll 을 확인. 아직 hello.exe가 실행되지 않은 상태 확인
F9를 눌러 module hello 까지 들어온다 (실제 실행 상태)
F8 을 누르며 넘기다 보면
main() 함수에서 사용하는 매개변수(파라미터) 확인
main함수의 시작임을 유추할 수 있다.
- 보통 main함수 시작 전 push를 3번 해준다.
CALL hello.003E1040 을 지날 때 CMD창에 hello world 가 나타남을 확인
003E1255 에 BP점을 잡아주고 ctrl + F2 로 재시작 해줌
스택의 base point(기점)를 알려주기 위해 ESP의 값을 EBP에 저장한다.
스택에 Hello.001E3000을 저장하고 동시에 [ESP -4] 되는 것을 알 수 있다
스택에는 001E3000 이라는 값이 저장되어있다
CALL hello.001E1060 실행 후 CMD창에 'hello word' 가 나타나는 것으로 봐서
printf() 함수 인것을 유추할 수 있다.
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
초기화면에서 F9를 눌러 module IN_OUT로 실행
이후 F8을 진행하면서 3개의 push점을 찾음 ( main()함수 시작점으로 유추)
BP점을 잡아주고 함수 내부로 이동
main() 함수 시작 시 스택의 상태
현재 EBP : 0028FACC ESP : 0028FA88
스택 창을 보면 ESP 에 013712FA가 저장되어 있다
main 함수 종료 후 return 주소
0137300 마우스 오른쪽 클릭 > Fallow in dump 후 Address를 보면 ASCII를 확인 할 수 있음
push 명령을 통해 0137300 을 스택에 저장하고
call printf() 함수를 호출해 '숫자를 입력하시오 : ' CMD 창에 출력
[EBP -4]에 변수 (num ==9) 이 입력되어 저장
013731C 에는 '입력한 숫자는 %d 입니다.' 문자열 있음
push 명령을 통해 스택에 올림
이전과 같은 printf() 함수
원래의 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 |