我使用MinGW中的气体(gcc,as和ld具体)来编译Windows中的以下待定shellcode ...
.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查找exc.exe使用的DLL,它发现正在使用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 :(得分: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