我必须为安全项目编写shellcode代码。仅仅是为了训练,我想编写一个打开一个非常简单的MessageBox的shellcode。下面是整个代码的摘录(这段代码只调用'LoadLibrary'和'ExitProcess'函数):
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
.code
start:
jmp short GetLibrary
GetLibraryReturn:
pop ecx ;recover 'user32.dllN'
mov ebx, 758c4977h ;recover LoadLibrary PTR
push ecx ;push 'kernel.dll'
call ebx ;invoke LoadLibrary
ender:
push eax
mov eax, 758c79b0h ;ExitProcess
call eax
GetLibrary:
call GetLibraryReturn
db 'user32.dll'
db 00h
[...]
end start
如您所见,它非常简单。但是,尽管您可以在代码的最后,还有以下指令:
db 00h
不幸的是,在编译之后,我在shellcode的中间有一个操作码'00'。 为了解决这个问题,有一个像这样的解决方案:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
.code
start:
jmp short GetLibrary
GetLibraryReturn:
pop ecx ;recover 'user32.dllN'
xor edx, edx ;init EDX register
mov [ecx + 10], dl ;replace 'N' by 'NULL'
mov ebx, 758c4977h ;recover LoadLibrary PTR
push ecx ;push 'kernel.dll'
call ebx ;invoke LoadLibrary
ender:
push eax
mov eax, 758c79b0h ;ExitProcess addr
call eax ;invoke 'ExitProcess'
GetLibrary:
call GetLibraryReturn
db 'user32.dllN' ;Push an additional character 'N'
end start
因此,副功能是在'user32.dll'原始字符串的末尾添加另一个字符。接下来我们只需将NULL替换为初始化edx寄存器为0并使用8位寄存器执行以下指令来替换'N'附加字符:
mov [ecx + 10], dl ;'10' corresponds to the 'user32.dll' string length
正如您所看到的,两个版本应该执行相同的操作。它只是生成的代码经过修改。不幸的是,执行失败了,我不明白为什么。也许在上面的表达式中添加一个关键字。我尝试了几种组合,但编译失败了。我真的迷路了。
非常感谢您的帮助。
答案 0 :(得分:0)
代码段不可写,因此如果您在代码段中定义了一个字符串,则默认情况下无法写入该字符串。您必须在数据段中声明它,或者您必须修改代码段的权限才能写入它。