【发布时间】:2018-01-07 20:44:12
【问题描述】:
考虑以下 C 代码 (x86_64)
#include <unistd.h>
int main()
{
execve("/bin/ls", 0, 0);
}
我编译为gcc a.c并执行;我收到了 SIGABRT 错误
A NULL argv[0] was passed through an exec system call. Aborted
接下来在gdb上运行,一开始我也得到了SIGABRT,但是我第二次运行它并且成功了!
Starting program: /bin/ls [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
为什么?
我测试了/bin/sh,发现它总是与 *argv[] = NULL 一起工作...
我再次编写了一些可执行文件(不需要任何参数)来测试并发现它们都可以工作。
所以我猜只有/bin/sh 或其他shell 可以将*argv[] 设置为NULL,其他文件(如/bin/ls)会失败或行为异常。
【问题讨论】:
-
阅读linux.die.net/man/2/execve,看看它需要什么参数。
-
是的,我知道它是 UB 以及参数 execve() 所期望的,但是有没有办法弄清楚它为什么起作用,或者只是运气。我正在解决一些安全挑战,如果我能找出它的工作原理,这可能对我的 shellcode 有很大的改进。
-
@poming 你在运行什么操作系统?
标签: c linux gdb exec system-calls