Вопрос или проблема
Я спрашивал это ранее, но удалил, так как, думаю, задал вопрос без привязки к msfvenom и пользовательским шаблонам EXE.
Существует 64-битный Windows PE, написанный на ассемблере, который идет вместе с Metasploit, и я пытаюсь скомпилировать его в EXE и использовать в качестве пользовательского шаблона для msfvenom. Как мне скомпилировать/связать/включить windows DLL в Kali? У меня установлен Mingw.
Я пробовал следующее:
nasm -fwin64 -o 64exetemplate.o 64exetemplate.nasm
Затем попытался связать с Mingw так:
86_64-w64-mingw32-ld -o 64exetemplate.exe 64exetemplate.o
Как мне заставить ассемблер компилироваться/связываться? Я думаю, что отсутствует путь к kernel32.dll, и я не уверен в синтаксисе.
Оба варианта выдают ошибки. Из предыдущего вопроса я понимаю, что мне нужно сказать Mingw/gcc, где находятся windows DLL или kernel32.dll?
root@box:/ nasm -f win64 64exetemplate.asm -o tiny.o
64exetemplate.asm:7: error: parser: instruction expected
64exetemplate.asm:8: error: symbol `extrn' redefined
64exetemplate.asm:8: error: parser: instruction expected
64exetemplate.asm:12: error: parser: instruction expected
64exetemplate.asm:26: error: symbol `main' redefined
64exetemplate.asm:26: error: parser: instruction expected
64exetemplate.asm:28: error: parser: instruction expected
64exetemplate.asm:29: error: parser: instruction expected
64exetemplate.asm:30: error: comma expected after operand 1
64exetemplate.asm:31: error: symbol `payload' redefined
64exetemplate.asm:31: error: parser: instruction expected
root@box:/ x86_64-w64-mingw32-ld -o 64exetemplate.exe 64exetemplate.o
64exetemplate.o:(.text+0x1d): undefined reference to `VirtualAlloc'
64exetemplate.o:(.text+0x3d): undefined reference to `ExitProcess'
Исходный файл ассемблера, который был использован для создания 64-битного Windows portable execution.
; Автор: Стивен Фьюэр (stephen_fewer[at]harmonysecurity[dot]com)
; Архитектура: x64
;
; Соберите и свяжите с помощью следующей команды:
; "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\x86_amd64\ml64" template_x64_windows.asm /link /su$
extrn ExitProcess : proc
extrn VirtualAlloc : proc
.code
main proc
sub rsp, 40 ;
mov r9, 40h ;
mov r8, 3000h ;
mov rdx, 4096 ;
xor rcx, rcx ;
call VirtualAlloc ; lpPayload = VirtualAlloc( NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE$
mov rcx, 4096 ;
mov rsi, payload ;
mov rdi, rax ;
rep movsb ; memcpy( lpPayload, payload, 4096 );
call rax ; lpPayload();
xor rcx, rcx ;
call ExitProcess ; ExitProcess( 0 );
main endp
payload proc
A byte 'PAYLOAD:'
B db 4096-8 dup ( 0 )
payload endp
end
Еще раз, я знаю, что задавал это раньше (теперь удалено), но это отличный вопрос для людей, желающих редактировать PE ASM для создания пользовательских шаблонов EXE с msfvenom. Я надеюсь, что я лучше сформулировал этот вопрос.
К сожалению, не существует единого стандарта для файлов на ассемблере.
(Хотя инструкции очевидно являются частью ISA, конкретный синтаксис файлов и, в частности, такие возможности, как extrn
, специфичны для каждого assembler.) Для компиляции этого в Linux вам нужно будет настроить синтаксис исходного кода ассемблера для использования синтаксиса nasm или gas. Существующий файл предназначен для MASM (Microsoft Assembler).
ml64 template_x64_windows.asm /link /subsystem:windows /defaultlib:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64\kernel32.lib" /entry:main.
Эта команда создает объектный файл из шаблона asm, а затем компилирует его в exe.
Ответ или решение
Чтобы создать пользовательский шаблон EXE для msfvenom на основе ассемблера, требующего компиляции для 64-битной версии Windows, вам необходимо сначала убедиться, что ваш код соответствует синтаксису ассемблера NASM, так как ваш исходный файл написан для MASM (Microsoft Assembler). Давайте разберем процесс пошагово.
1. Подготовка кода
Ваш оригинальный код использует синтаксис MASM, который отличается от синтаксиса NASM. Необходимо выполнить следующие изменения:
- Замените
proc
иendp
наglobal
иsection .text
для определения процедур. - Замените директиву
extrn
наglobal
для внешних процедур, таких какExitProcess
иVirtualAlloc
.
Вот пример адаптированного кода:
section .text
global main
extern ExitProcess
extern VirtualAlloc
main:
sub rsp, 40
mov r9, 40h
mov r8, 3000h
mov rdx, 4096
xor rcx, rcx
call VirtualAlloc ; lpPayload = VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
mov rcx, 4096
mov rsi, payload
mov rdi, rax
rep movsb ; memcpy(lpPayload, payload, 4096);
call rax ; lpPayload();
xor rcx, rcx
call ExitProcess ; ExitProcess(0);
section .data
payload:
db 'PAYLOAD:', 4096 - 8 dup (0)
2. Компиляция и линковка
Теперь, когда ваш код адаптирован для NASM, вы можете перейти к компиляции и линковке. Убедитесь, что вы используете правильные флаги для NASM и ld. Выполните следующие команды:
nasm -f win64 -o 64exetemplate.o 64exetemplate.asm
Следующий шаг – линковка. Для этого используйте gcc
для создания EXE и указания нужных библиотек, таких как kernel32.lib
. Чтобы указать пути к библиотекам и необходимым DLL, выполните команду:
x86_64-w64-mingw32-gcc -o 64exetemplate.exe 64exetemplate.o -lkernel32 -luser32
3. Устранение ошибок
Если по-прежнему возникают ошибки, например, "undefined reference to ‘VirtualAlloc’", это может указывать на необходимость добавления путей к .lib файлам или других библиотек в вашу команду линковки. Убедитесь, что вы установили mingw-w64:
apt-get install mingw-w64
И проверьте, что пути к библиотекам установлены правильно. Вы можете искать kernel32.dll
и другие необходимые библиотеки и указывать их с помощью флага -L
для gcc, если они расположены в нестандартных директориях.
Заключение
Создание пользовательских EXE шаблонов для msfvenom требует знание структуры Portable Executable (PE) и правильной конфигурации ассемблера. Понимание различий между синтаксисами MASM и NASM, а также правильное указание библиотек, являются ключевыми факторами в успешной компиляции и линковке вашего кода. Если у вас появятся дополнительные вопросы в процессе, рассматривайте сообщество Metasploit и документацию, так как это может существенно облегчить процесс.