Lord of BOF_2_Cobolt

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

핵심 알고리즘은 다음과 같다.
- main함수 인자를 받는다.
- gets 함수로 buffer에 인자를 받는다.
gets 함수는 취약한 함수이다. stdin으로부터 입력값을 받는 함수인데, 버퍼의 크기를 제한하지 않아 BOF 가능하다.

스택 구조를 보기 위해 디스어셈블했다.
스택 구조는 다음과 같다.
- push ebp로 ebp 백업
- sub esp, 0x10 코드로 스택을 0x10만큼 확보
- gets 함수 인자로 ebp-16 을 넣음 ( = ebp-0x10)
EBP - 0x10 gets 버퍼 주소
...
EBP + 0x0 EBP backup
EBP + 0x4 return address

역시 버퍼가 작으므로, 환경변수를 이용하기로 한다.
이전 문제(gremlin)에서 이용했던 환경변수 주소를 얻는 코드를 업데이트 했다.
이 코드를 통해 환경변수를 등록한 셸을 실행하게 된다.
이 셸에서 다시 환경변수 주소를 얻는 프로그램을 실행하여 주소를 얻고, 그 주소를 이용하여 익스플로잇한다.

(환경변수 주소를 얻는 코드)

환경변수를 등록하고 셸을 실행한 뒤, 환경변수 주소를 얻는 프로그램을 실행한 결과이다.
주소 0xbffffd9d에 환경변수가 있다.

주소를 이용하여 익스플로잇 코드를 작성했다 .

주의할 점은, 이번 문제는 stdin을 이용하므로, 셸에 입력값을 주기 위해 cat 을 이용해야 한다는 점이다!!
goblin 비밀번호는 hackers proof 이다.
tags: writeup, pwnable, buffer overflow, stack overflow, memory corruption, environment variables, eggshell, elf file, linux, c lang, x86asm