首页
社区
课程
招聘
[求助]在shellcode中遇到疑惑的浮点指令
发表于: 2011-6-9 14:11 11936

[求助]在shellcode中遇到疑惑的浮点指令

2011-6-9 14:11
11936

今天看到一个样本中一段shellcode的解码头,从样本中拿出来后用IDA反汇编得到如下结果:

seg000:00000000                 nop
seg000:00000001                 nop
seg000:00000002                 nop
seg000:00000003                 nop
seg000:00000004                 fldz
seg000:00000006                 fnstenv byte ptr [esp-0Ch]
seg000:0000000A                 pop     esi
seg000:0000000B                 add     esi, 20h ; ' '
seg000:0000000E                 push    esi
seg000:0000000F                 pop     edi
seg000:00000010                 xor     ecx, ecx
seg000:00000012                 mov     cx, 2FFh
seg000:00000016
seg000:00000016 loc_16:                                 ; CODE XREF: seg000:00000022
seg000:00000016                 lodsw
seg000:00000018                 sub     ax, 6161h
seg000:0000001C                 shl     al, 4
seg000:0000001F                 add     al, ah
seg000:00000021                 stosb
seg000:00000022                 loop    loc_16
seg000:00000022 seg000          ends
【后面是编码的shellcode】

看到里面fldz和fnstenv指令感到很疑惑,怀疑这段代码不能执行。于是放到OD中调试,由于esi被初始化指向了非法地址,导致运行产生异常。

这个样本先把包括解码头的整个shellcode复制到内存,然后用createthread把shellocde带起来。但是直接打开样本发现shellcode被解码并成功执行,最终释放一个exe并运行。

我的问题是fldz和fnstenv在线程中是如何对esi产生影响并完成解码工作,请各位指点。谢谢!


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
2
第一次看到使用浮点解码shellcode的。。厉害
2011-6-9 15:13
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
3
一看到浮点 就头疼,更何况 连fnstenv 指令都没见过的我
2011-6-9 15:17
0
雪    币: 258
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
主要有两点疑惑:

1.调试与非调试状态下指令的执行难道存在区别,因为调试器下发生异常后进程就直接终止了,而直接执行样本中的负载被释放执行了。
2.放在线程中执行的shellcode也有其特殊之处吗?

想知道为什么,贴上来看看看雪的兄弟们有没有人知道的。
2011-6-9 15:39
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
5
我认真看了下。。。。
FLDZ:将0.0装入st(0): st(0) <- 0.0
FSTENV/FNSTENV :(DST:14字节存贮器操作数)
(DST)(控制寄存器)
(DST+2)(状态寄存器)
(DST+4)(标记寄存器)
(DST+6)(指令指示器)
(DST+10)(操作数指示器)
所有错误屏蔽位置1

感觉FLDZ 和FNSTENV 执行算是垃圾指令,并不影响解码的过程

http://web.nuist.edu.cn/courses/wjyljyy/07336.htm
2011-6-9 15:48
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
6
调试状态和非调试状态,状态寄存器会有区别,调试状态堆栈与直接执行状态堆栈是有些区别,
第二个问题我不知道,没有试过把shellcode放在线程中
2011-6-9 15:51
0
雪    币: 258
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢仙果!

两条f指令结束后esi就被设置到正确的编码shellcode地址开头了,但在OD里得到的esi是错误的,我再研究研究去。
2011-6-9 16:07
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
重定位 细节可以google之
2011-6-9 16:35
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
9
能否解释详细点呢?
2011-6-9 16:38
0
雪    币: 258
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
fldz和fnstenv两条指令不但可以实现重定位,还能在一定程度上检测断点。

seg000:00000000                 nop
seg000:00000001                 nop
seg000:00000002                 nop
seg000:00000003                 nop
seg000:00000004                 fldz


上面五条指令的任意一条上设置断点,最后从栈顶得到的esi不是正确值。

seg000:00000006                 fnstenv byte ptr [esp-0Ch]


从这里以后的地址上下断点,得到的esi就指向fldz指令的地址,然后通过修正得到正确的地址。

同时也谢谢fuestck的回复,不知道的东西太多了,今后还要加强学习积累。
2011-6-9 16:42
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
fnstenv 将最后执行的一条FPU 指令相关的协处理器的信息保存在指定的内存中,是按结构保存的
该结构偏移12字节处就是最后执行的浮点指令的运行时地址,本来有图的我这里粘贴不方便,更详细的你可以google ‘fnstenv 重定位‘
2011-6-9 16:57
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
12
非常感谢你的解释!!!
2011-6-9 21:51
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
浮点指令
2011-6-20 21:23
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
怎么到处都是牛啊
2011-6-21 16:22
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
15
这个也遇到了。shellcode里面fldz和fstenv一执行就破坏了原shellcode,不得其解
2011-7-12 16:14
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
16
00427519    D9EE            fldz
0042751B    D97424 F4       fstenv  (28-byte) ptr [esp-C]
0042751F    5B              pop     ebx

ebx=00427519
http://skypher.com/wiki/index.php/Hacking/Shellcode/GetPC
2011-7-12 16:26
0
游客
登录 | 注册 方可回帖
返回
//