今天看到一个样本中一段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产生影响并完成解码工作,请各位指点。谢谢!
- 标 题:在shellcode中遇到疑惑的浮点指令
- 作 者:lhjjx
- 时 间:2011-06-09 14:11:03
- 链 接:http://bbs.pediy.com/showthread.php?t=135162