【问题标题】:x86 syscalls access violation writing locationx86 系统调用访问冲突写入位置
【发布时间】: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 位。

标签: assembly x86 intel


【解决方案1】:

由于某种原因,您的反汇编似乎有 16 位指令(使用 16 位寄存器,如 cx、ax 等)。违规指令访问 [si] 处的内存。 si 的值是 esi 的底部 2 个字节,这将导致一个 sub-0x10000 值,如 0x0000F9A8。截断地址的上半部分可能是导致错误的原因。我不确定您使用什么来组装,但请尝试检查其命令行选项以确保您没有设置 16 位标志或其他东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2020-09-04
    • 2012-12-05
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多