VoID shellcodeFun-eip计算
- + -
code:
VOID ShellCodeFun(VOID)
{
__asm
{
push eax //占位,一会儿用做跳转地址
pushad //大小0x20
pushfd //大小0x04
call L001
L001:
pop ebx
sub ebx,8 -------------------------------------------------?
push dword ptr ds:[ebx+0x34] //szDllPath
call dword ptr ds:[ebx+0x30] //LoadLibraryA
mov eax,dword ptr ds:[ebx+0x38] //OriginalEIP
xchg eax,[esp+0x24] //将原来的EIP交换到栈上
popfd
popad
retn //jmp to OriginalEIP
nop
nop
nop
nop
nop
}
}
[popexizhi: 这里的ebx,8为什么是可以自定义到入口的eip地址,这个pope一直没有计算明白,参见下图1,而pope的计算方式是图2,这里的8,是指 push eax这个命令在内存执行占用1字节的地址存储空间,不是说push eax指定的内存50~5E地址,见图1的A部分,是代码段本身的占用地址,不是其所指向的内存位置地址,所以剩下的就好解释了
pusha 代码段占用1个字节(图1 中的 60)
pushf 代码段占用1个字节(图1 中的 9c)
call $+5 代码段占用5个字节(图1 中的 E8 00 00 00 00)
而调用了L001之后的
先把eip出站到ebx中
再用ebx-8,就得到了调用这个shellcode之前的最后一个执行地址,即eip的内容了:)PS:IDA好强大,好厉害啊,刚刚知道这个tool,敬意一个:)
]
图1
-
没有评论:
发表评论