以64位ctfshow的1024_happy_checkin为例子
正确的exp
第一个点:接收问题
我原本写的是u64(r.recv(6),ljust(8,b'\x00')),但是错了
可以修改成为下面两种写法
两个都是接收方式
第一个接收方式里面r.recvuntil('\xe3\x06\x40'+'\x0a')是指的到这一串字符停止,puts_addr=u64(r.recv(6)+'\x00\x00')意思是接收6个字符,然后因为8位,所以补两个0
第二个就是接受以7f为首的字符接收6个,然后补8个0
第二个点:ret
64位总是会加一个ret,我们平时看的解释是因为保持栈平衡,但这究竟是为什么呢?
在gdb调试中我们可以观察到,他有用到一个指令movaps,意思就是要求16字节对齐,16字节对齐的意思就是能被16整除,也就是0x10整除,在我们加了一个ret后,栈就会向下移动一步,意为加8,而在加8后就会16字节对齐,才能满足movaps指令,同理我们加3个ret和一个ret是一个意思
第三个点:注意位子
首先要分清楚64位和32位的区别,32位是直接把参数放到栈上,64位则是把参数放到寄存器,rdi是一个寄存器,所以在他的后面应该是跟着参数才对