- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了系统调用但未找到。这是我在 asm 中的代码
section .text
global _start
_start:
xor eax,eax
push eax
push dword '//ls'
push dword '/bin'
mov ebx,esp
mov al,0xb
int 0x80
;/bin//ls
当由此构建静态 32 位可执行文件并运行它时,我得到:
A NULL argv[0] was passed through an exec system call.
Aborted (core dumped)
这里发生了什么以及如何解决它?
最佳答案
您的代码按您的预期工作,进行了成功的 execve("/bin//ls", NULL, NULL)
系统调用。
问题在于 GNU ls
与 sh
或其他一些程序不同,它在运行空 argv[]< 时选择中止 ()/
。通常的约定是将程序名称作为第一个参数传递 (argv[0]
)。
您的程序使用 /bin//sh
而不是 ls
可以正常工作
execve
的 argv 和 envp args 来自离开 ECX 和 EDX = 0,因为 Linux 选择在进入用户空间之前设置它们。 (这避免了内核信息泄漏,而不是让它们未初始化)。显然,这在将使用包含未知值的寄存器运行的 shellcode 中不起作用。
顺便说一句,Linux execve()
does document它支持传递 envp 和/或 argv=NULL
而不是 argv = (char*[]){NULL};
(指向 NULL 的指针)。不是为未指向有效内存的 argv
返回 -EFAULT
,而是将 NULL 特殊情况作为空数组。
我可以使用 ls (GNU coreutils) 8.31
在 Arch Linux 上重现您的结果
$ nasm -felf32 exec.asm
$ ld -melf_i386 -o exec exec.o
$ ./exec
A NULL argv[0] was passed through an exec system call.
Aborted (core dumped)
您可以使用 strace
来确定消息不是来自您的进程。
$ strace ./exec
execve("./exec", ["./exec"], 0x7ffd7090ed90 /* 54 vars */) = 0 <=== starting your program
strace: [ Process PID=21152 runs in 32 bit mode. ]
execve("/bin//ls", NULL, NULL) = 0 <==== This is your system call
# then ls starts up normally
strace: [ Process PID=21152 runs in 64 bit mode. ]
brk(NULL) = 0x55b5fbaff000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe1d74c5b0) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
... normal dynamically-linked executable startup stuff ...
... until it writes a message to stderr and raises SIGABRT ...
write(2, "A NULL argv[0] was passed throug"..., 55A NULL argv[0] was passed through an exec system call.
) = 55
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
getpid() = 21152
gettid() = 21152
tgkill(21152, 21152, SIGABRT) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=21152, si_uid=1000} ---
+++ killed by SIGABRT (core dumped) +++
Aborted (core dumped)
如果您查看 ls
的源代码,您可能会看到 abort()
函数调用,尤其是当您搜索它打印的字符串时。
正如我所说,bash
和大多数其他 shell 不这样做。
如果你确实想修复它,你可能想创建一个指针数组 {"/bin//ls", NULL}
并将指向它的指针作为第二个参数传递。
...
mov ebx, esp ; path
push eax ; 0
push ebx ; pointer to the filename
mov ecx, esp ; argv = pointer to that array
cdq ; envp = EDX = 0 (broadcast high bit of EAX into EDX)
mov al, 0xb
int 0x80
为了更好的测量,我添加了 EDX 归零。
这对我有用:ls
成功运行。
关于linux - 如何修复 'SYSCALL execve' : ls complains about a NULL argv[0],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57682494/
class ClassA { class ClassB { } } let compiles: [ClassA.ClassB] let doesNotCompile = [ClassA
同时使用 facebook debugger ,它提示: Warning fb:app_id hasn't been included in the meta tags. Specify the ap
我仍在尝试掌握 Flow 的工作原理,任何人都可以解释为什么这个简单的示例会引发错误? function say(text: string) { console.log(text); } say(
在下面的代码中: public class FooMain { private static void foo(byte b) {} public static void main(S
出于测试目的,我经常开始在现有项目中键入一些代码。因此,我要测试的代码先于所有其他代码,如下所示: public static void main(String[] args) { char
我知道有一百万个关于单例的问题和答案,但我似乎无法找到解决方案。所以冒着反对票的风险,这是我的问题: 我想使用 Andrei Alexandrescu 的现代 C++ 设计中的单例实现: 标题: cl
我是Flutter的初学者。我想创建将数据显示为list,piechart和barchart的TabBarView。当我开始编码时,一切都很好。为了查看它是否正常工作,我在选项卡上附加了不同的颜色。首
这个问题是关于类型转换中的"is"和“作为”以及CA1800 PostSharp规则。我想知道我认为的解决方案是否是最好的解决方案,或者它是否存在我看不到的任何问题。 我有这段代码(名为 Origin
我是 Java 实体的新手,我从 Query.getSingleResult() 调用中遇到了一些奇怪的问题。这是一个代码片段: LoaPoliciesConfig policy = new Lo
SO 上已经有很多关于 unique_ptr 和不完整类型的问题,但没有一个能给我一个概念来理解为什么以下内容不起作用: // error: ... std::pair::second has inc
我有这个代码: struct A{}; template struct B { void foo() {} }; B b; //Error: missing template argument
这个问题在这里已经有了答案: Understanding checked vs unchecked exceptions in Java (21 个答案) 关闭 4 年前。 我有以下代码: publ
我正在使用 OneSignal 来管理我的推送通知。对于某些通知,我收到: Notifications must have English language content 但我只用英语发送所有内容.
我正在尝试执行一个使用 XML::Simple 的简单 Perl 程序从 XML 文件中打印出数据。但是,我得到的错误是: no element found at line 15, column 0,
我正在阅读官方文档:https://react.dev/learn/keeping-components-pure#detecting-impure-calculations-with-strict-
我正在阅读官方文件:https://react.dev/learn/keeping-components-pure#detecting-impure-calculations-with-strict-
我有这个死简单.travis.yml对于一个java项目。当我对文件运行“travis-lint”时提示 [17:24:23@emeraldjava]$ travis-lint /Users/paul
下面是我的二头肌代码,用于创建和分配策略来检测没有诊断设置的 key 保管库。该策略具有 deployIfNotExists 设置。因此它也应该能够创建缺失的诊断设置。 (来自具有修复过程的门户) t
我有以下脚本,它通过 ssh 连接到远程服务器并在其 Postgresql 数据库上发出 SQL 语句: #!/bin/bash db_query() { app_server="$1"
我一直在研究 Swift 协议(protocol),我想弄清楚为什么这段代码不起作用... protocol Animal { var name: String {get} var breed
我是一名优秀的程序员,十分优秀!