Есть ли разница между MASM shellcode и NASM shellcode

Я новичок в StackOverflow. Недавно я начал изучать сборку и довольно новичок в сборке, совершенно новый для shellcode. Я использую RadAsm для компиляции с помощью ассемблера MASM, и я попытался изучить shellcode с этого сайта Shellcoding для Linux и Windows

Я использую RadAsm в 64-разрядной версии Windows. Код, который я использовал почти такой же, за исключением того, что я использовать абсолютное имя функции, а не адрес функции в DLL. Шеллкод предполагается использовать функцию sleep с параметром 5000.

это код, который я использую в MASM.

.386
.model flat, stdcall
option casemap:none

include kernel32.inc
includelib kernel32.lib

.code
_start:
    xor eax, eax    ; zero out eax
    mov ebx, Sleep  ; function sleep goes in ebx
    mov ax, 5000    ; parameter goes in ax
    push eax        ; parameter on stack
    call ebx        ; call Sleep
end _start
end

это собирает без ошибок в MASM.

генерируемый shellcode имеет нулевые значения и немного отличается от веб-сайта. Это так.

Я objdump -d nameofexecutable.exe чтобы получить разборки.

Disassembly of section .text
 00401000 <.text>:
  401000:       33 c0                   xor    %eax,%eax
  401002:       bb 0e 10 40 00          mov    x40100e,%
  401007:       66 b8 88 13             mov    x1388,%ax
  40100b:       50                      push   %eax
  40100c:       ff d3                   call   *%ebx
  40100e:       ff 25 00 20 40 00       jmp    *0x402000

но на сайте нет 00 hex-кодов.

Disassembly of section .text:

08048080 <_start>:
 8048080:       31 c0                   xor    %eax,%eax
 8048082:       bb ea 1b e6 77          mov    x77e61bea,%ebx
 8048087:       66 b8 88 13             mov    x1388,%ax
 804808b:       50                      push   %eax
 804808c:       ff d3                   call   *%ebx

может быть потому, что я использование x64 для компиляции или потому, что я вызываю функцию косвенно?

любая помощь будет оценили, спасибо.

2 ответов


простой ответ заключается в том, что MASM отстой!!

взято с здесь "в прошлом я разработал 32-битный шеллкод, используя бесплатный сетевой ассемблер с открытым исходным кодом (NASM), но, проходя через упражнение по изучению 64-битного разнообразия, я решил попробовать его с помощью Microsoft Assembler (MASM). Одна проблема быстро стала очевидной: MASM не предлагает способа (который я знаю) генерировать необработанный двоичный машинный код в отличие от an .exe файл! Не все потеряно хотя, байты кода можно извлечь из .exe-файл достаточно легко (но в будущем я могу вернуться к NASM).", труднее создать шелл-код.

Я использовал NASM для создания shellcode для программы, которая говорит Эй из ссылки, которую вы предоставили в windows x64, это результат, которого я достиг, никаких нулевых байтов. Оказывается, пример для сна может работать неправильно, но второй пример полностью функциональный.

"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x2f\x59\x88\x51\x0a"
"\xbb\x82\xf8\x60\x77\x51\xff\xd3\xeb\x31\x59\x31\xd2"
"\x88\x51\x0b\x51\x50\xbb\xe6\x4d\x61\x77\x59\x31\xd2"
"\x88\x51\x03\x31\xd2\x52\x51\x51\x52\x31\x32\xd2\x50"
"\xb8\xca\x3a\x61\x77\xe8\xcc\xff\xff\xff\x75\x73\x65"
"\x72\x33\x32\x2e\x64\x6c\x6c\x4e\xe8\xca\xff\xff\xff"
"\x4d\x65\x73\x73\x61\x67\x65\x42\x6f\x78\x41\x4e\xe8"
"\xc6\xff\xff\xff\x48\x65\x79\x4e"

Примечание: используйте nameofexecutable.o с objdump

ie. objdump-o nameofexecutable.o, чтобы получить shellcode, а не nameofexecutable.exe


ваш код собран для запуска в 0x00401000, поэтому самый высокий байт всех адресов в конечном итоге равен 0x00. Их код собран для запуска в 0x08048080, поэтому самый высокий байт всех их адресов в конечном итоге равен 0x08.

вот откуда берутся все ваши нули.