【发布时间】:2023-03-30 01:49:02
【问题描述】:
我正在使用来自 MinGW 的 gas(具体来说是 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
...在注释所在的源文件(例如)中定义。
它产生了与上面完全相同的链接错误...
我做错了什么?
【问题讨论】:
-
尝试将
-l开关放在对象之后。众所周知,ld的某些版本很挑剔。还可以尝试删除下划线,某些版本会自动添加。更新:实际上您需要使用带有 2 个下划线的__execlp,所以不要删除而是再添加一个 :) -
切换位置没有帮助。 execlp 的遗留函数可以使用下划线,即使它没有将下划线识别为气体(确实如此),它仍然会调用参数和功能相同的 _execlp。下划线只是宝宝喜欢的方式(气体),所以我不会胡闹。还是卡住了……
-
我测试过,你需要2个下划线。至少这是我的 msvcrt 中唯一的版本。
-
在execlp(__execlp)前改成两个下划线,依然不爽。编辑:“它仍然会调用 [execlp]”。对不起。
-
__execv 工作得很好......
标签: assembly mingw gnu-assembler shellcode