Lord of BOF_1_Gremlin

C언어 소스코드와 실행파일을 준다.
소스코드의 내용은 다음과 같다.

핵심 알고리즘은 다음과 같다.
- main함수 인자를 받는다.
argv[1]내용을 buffer에 strcpy한다.
앞 문제(gate)와 비슷한 알고리즘이다. 다른 점이 하나 있는데, 버퍼의 크기가 작아졌다는 점이다.
버퍼의 크기가 작을 때 활용할 수 있는 방법을 생각해 보아야 한다.
아예 셸 코드를 return address 위쪽에 넣는 방법과, 환경변수를 이용하는 방법 등이 있겠다.
return address 위쪽에 넣는 방법
첫 째로, return address 위쪽에 넣는 방법을 이용해 보자.

스택 구조는 다음과 같다.
- push ebp로 ebp 백업
- sub esp, 0x10 코드로 스택을 0x10만큼 확보 (코드에는 16으로, 10진수로 써 있음. 헷갈리면 att문법으로 변환해 보자)
- strcpy 함수 인자로 ebp-16 을 넣음 ( = ebp-0x10)
EBP - 0x10 strcpy 인자
...
EBP + 0x0 EBP backup
EBP + 0x4 return address셸 코드는 return address의 뒤인 EBP+0x8부터 넣을 것이다.
gate 문제에서 한 방법과 같은 방법으로, core 파일을 생성한다. (지난번 문제에서 이용한 core파일을 지워야 정상적으로 생성된다)

A는 버퍼, B는 EBP backup, C는 return address, D는 셸 코드 자리를 의미한다.
주의할 점은, D의 크기가 정확히 셸 코드와 일치해야 한다는 점이다. argv의 크기가 실제 익스플로잇 실행 시와 다르면 스택이 변경되기 때문이다.
지난번 만든 셸 코드의 크기는 31(십진수)이므로, 31개의 D를 넣는다.

D의 아스키코드인 0x44가 시작되는 지점의 주소는 0xbffffaf0 이다.

얻은 주소를 이용하여 익스플로잇 코드를 썼다.

gate에서 이용한 방법으로 링크 파일을 만들고, exploit 했다.
cobolt의 비밀번호는 hacking exposed 이다.
환경변수를 이용하는 방법
이번엔 환경변수를 사용하는 방법을 이용해 보자.
환경변수에 셸 코드를 등록한다.

환경변수의 주소를 얻기 위해 코드를 썼다. cobolt와 프로그램 경로 길이가 같도록 맞춰주었다. 환경변수는 0xbfffff07에 있다는 것을 알아냈다.

이 방법 역시 성공했다.
tags: writeup, pwnable, buffer overflow, stack overflow, memory corruption, environment variables, eggshell, elf file, linux, c lang, x86asm