Я использую газ из MinGW (GCC, так и л.д. быть конкретными) составить следующую, чтобы быть Шеллкод в Windows ...Как связать эту программу execlp с помощью ld в Windows?
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
#.extern _execlp
.def _execlp; .scl 2; .type 32; .endef
_main:
push %ebp
movl %esp, %ebp
pushl $0
pushl $0x00657865
pushl $0x2e646d63
call _execlp
movl %ebp, %esp
pop %ebp
Это нормально компилируется, используя ...
as -o ex.o ex.s
Где ex.s - исходный файл сборки.
Но во время связывания ...
ld -o ex.exe ex.o
Это дает ошибку ...
ex.o:fake:(.text+0x10): undefined reference to 'execlp'
Так что я попытался сделать его ехЬегп положить ...
.extern _execlp
... выше, где определение (комментарий).
Тем временем я имел .c файл с этим кодом (который первоначально генерировал ex.s файл (с помощью GCC-S -m32 -o ex.s ex.c)) ...
#include <process.h>
int main(int argc, char *argv[])
{
execlp("cmd.exe", 0);
return 0;
}
При составлении с ...
gcc -o exc.exe exc.c
Где exc.c - это c-файл. Он компилируется и запускается с требуемой функциональностью ... Итак, я использовал Dependency Walker для поиска DLL, используемого exc.exe, и обнаружил, что используются kernel32.dll, ntdll.dll и msvcrt.dll. msvcrt важен, потому что это c-библиотека времени выполнения (которая содержит execlp). Так что я попытался связать ex.o как так ...
ld -lkernel32 -lndtll -lmsvcrt -o ex.exe ex.o
... с
.extern _execlp
... определены в исходном файле (ex.s), где комментарий есть.
Это породило ту же самую ошибку, связывающую как выше ...
Что я делаю неправильно?
Попробуйте поместить в '-l' переключатели после того, как объект. Некоторые версии 'ld', как известно, придирчивы. Также попробуйте удалить подчеркивание, некоторые версии добавят это автоматически. Обновление: на самом деле вам нужно использовать '__execlp' с 2 символами подчеркивания, поэтому не удаляйте, а добавляйте еще один :) – Jester
Местоположение переключателей не помогает. Унаследованная функция execlp отлично подходит для подчеркивания, и даже если она не распознает подчеркивание как вещь газа (она есть), она все равно вызовет _execlp, которая идентична параметрам и функциональности.И подчеркивания - это то, как ребенок любит это (газ), поэтому я не буду обманывать это. Все еще застрял .... – August
Я протестировал, вам нужно 2 символа подчеркивания. По крайней мере, это единственная версия в моем msvcrt. – Jester