如何在Windows中使用ld链接此execlp程序?

时间:2016-06-01 21:16:36

标签: assembly mingw gas shellcode

我使用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)中定义。

它产生了与上面相同的链接错误......

我做错了什么?

1 个答案:

答案 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

相关联