使用MASM32不起作用的小的弱点

时间:2013-11-30 16:48:34

标签: assembly x86 nasm masm masm32

我必须为安全项目编写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

正如您所看到的,两个版本应该执行相同的操作。它只是生成的代码经过修改。不幸的是,执行失败了,我不明白为什么。也许在上面的表达式中添加一个关键字。我尝试了几种组合,但编译失败了。我真的迷路了。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

代码段不可写,因此如果您在代码段中定义了一个字符串,则默认情况下无法写入该字符串。您必须在数据段中声明它,或者您必须修改代码段的权限才能写入它。