在编写shellcode中经常会遇见自定位代码,于是总结了一些方法。
1.CALL/POP型 635D96F1 E8 00000000 call mshtml.635D96F6 635D96F6 58 pop eax 635D96F7 90 nop CALL指令做的操作是压栈下一个地址,跳向指定地址,利用这个特征可以利用CALL/POP操作定位当前位置。
2.CALL/POP改进型 前一种好用但是有缺陷,比如会出现较多的00,可能造成截断,于是有了改进型。 635D96F1 E8 FFFFFFFF call mshtml.635D96F5 635D96F6 C2 5890 retn 0x9058 635D96F9 90 nop 跟进635D96F1这个CALL后代码将重新解释如下: 635D96F5 FFC2 inc edx 635D96F7 58 pop eax 位置保存于eax。
3.浮点运算型 0013FED0 D9EE fldz 0013FED2 D97424 F4 fstenv (28-byte)ptr ss:[esp-0xC] 0013FED6 5B pop ebx 浮点运算后位置保存在栈顶,通过POP操作可以获取其位置。 我在我的shellcode中使用此参数常出现异常,所以用得较少,不过metasploit上面用得蛮多的。
4.中断型 使用INT 2c或者INT 2e可以获取下一个执行地址,下一个执行地址将会保存于ebx。 在调试状态无法达到预期的效果,如果想看见效果可以将调试器设置为默认调试器,执行以下代码看见效果: __asm { Int 3 Int 2c }
5.异常处理型 在shellcode代码中构建一个异常处理函数,再构造一个异常进入异常处理中获取EIP 这种方法编写难度稍微大点,也是可行的。
|