2016-06-01 6 views
1

Я использую газ из 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), где комментарий есть.

Это породило ту же самую ошибку, связывающую как выше ...

Что я делаю неправильно?

+0

Попробуйте поместить в '-l' переключатели после того, как объект. Некоторые версии 'ld', как известно, придирчивы. Также попробуйте удалить подчеркивание, некоторые версии добавят это автоматически. Обновление: на самом деле вам нужно использовать '__execlp' с 2 символами подчеркивания, поэтому не удаляйте, а добавляйте еще один :) – Jester

+0

Местоположение переключателей не помогает. Унаследованная функция execlp отлично подходит для подчеркивания, и даже если она не распознает подчеркивание как вещь газа (она есть), она все равно вызовет _execlp, которая идентична параметрам и функциональности.И подчеркивания - это то, как ребенок любит это (газ), поэтому я не буду обманывать это. Все еще застрял .... – August

+0

Я протестировал, вам нужно 2 символа подчеркивания. По крайней мере, это единственная версия в моем msvcrt. – Jester

ответ

3

Вам необходимо использовать 2 символа подчеркивания и список библиотек после объектного файла. Кроме того, вы неверно передаете аргументы. Это работает для меня:

.globl _main 
_main: 
    push %ebp 
    movl %esp, %ebp 
    pushl $0x00657865 
    pushl $0x2e646d63 
    pushl $0 
    lea 4(%esp), %eax 
    pushl %eax 
    call __execlp 

Собранный с: as -o ex.o ex.s

Связан с: ld -o ex.exe ex.o -lkernel32 -lmsvcrt

+0

Работает! Большое спасибо! – August

Смежные вопросы