【发布时间】:2020-10-19 18:49:40
【问题描述】:
我正在做一个小项目,旨在从 ntdlls 导出中获取系统调用 ID,然后做一些恶作剧来正确映射参数以调用它。看来我做的一切都是正确的,但是我的 asm 中有一个未处理的异常。
源代码:
mov edx , ecx
pop ecx
pop eax
mov DWORD PTR [esp] , ecx ; Access violation writing location 0x0000F8B8.
mov eax , DWORD PTR [esp+18h]
反汇编代码:
mov dx,cx
pop cx
pop ax
mov word ptr [si],cx ; Access violation writing location 0x0000F8B8.
and al,67h
mov ax,word ptr [esp+18h]
EAX = 00007B00 EBX = 00000000 ECX = 001F59F5 EDX = 43D2FFFF ESI = 43D2F8B8
EDI = 43D2F450 EIP = 7B010CAD ESP = 43D2F33C EBP = 43D2F450 EFL = 00010246
【问题讨论】:
-
如果这确实是错误发生的地方,则意味着您已经删除了
esp。问题出在早期代码的其他地方。 -
是的,[esp] 绝对应该可以访问。 0x0000F9A8 通常对于堆栈指针来说太低了。我认为您之前在 esp 中插入了一个堆指针或其他不正确的值。
-
在此之前,我只是映射参数并调用 asm 存根。
-
Asm 存根?它有什么作用,你怎么称呼它?映射参数需要什么?
-
是的,现在匹配了。这意味着您错误地组装了代码。我认为你为 16 位组装了 32 位代码,在 32 位模式下执行时会将所有内容恢复为 16 位。