能力值:
(RANK:860 )
|
-
-
2 楼
第一次看到使用浮点解码shellcode的。。厉害
|
能力值:
( LV12,RANK:360 )
|
-
-
3 楼
一看到浮点 就头疼,更何况 连fnstenv 指令都没见过的我
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
主要有两点疑惑:
1.调试与非调试状态下指令的执行难道存在区别,因为调试器下发生异常后进程就直接终止了,而直接执行样本中的负载被释放执行了。
2.放在线程中执行的shellcode也有其特殊之处吗?
想知道为什么,贴上来看看看雪的兄弟们有没有人知道的。
|
能力值:
(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
|
能力值:
(RANK:860 )
|
-
-
6 楼
调试状态和非调试状态,状态寄存器会有区别,调试状态堆栈与直接执行状态堆栈是有些区别,
第二个问题我不知道,没有试过把shellcode放在线程中
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢仙果!
两条f指令结束后esi就被设置到正确的编码shellcode地址开头了,但在OD里得到的esi是错误的,我再研究研究去。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
重定位 细节可以google之
|
能力值:
(RANK:860 )
|
-
-
9 楼
能否解释详细点呢?
|
能力值:
( 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的回复,不知道的东西太多了,今后还要加强学习积累。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
fnstenv 将最后执行的一条FPU 指令相关的协处理器的信息保存在指定的内存中,是按结构保存的
该结构偏移12字节处就是最后执行的浮点指令的运行时地址,本来有图的我这里粘贴不方便,更详细的你可以google ‘fnstenv 重定位‘
|
能力值:
(RANK:860 )
|
-
-
12 楼
非常感谢你的解释!!!
|
能力值:
( LV8,RANK:120 )
|
-
-
13 楼
浮点指令
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
怎么到处都是牛啊
|
能力值:
( LV12,RANK:210 )
|
-
-
15 楼
这个也遇到了。shellcode里面fldz和fstenv一执行就破坏了原shellcode,不得其解
|
能力值:
( 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
|
|
|