【问题标题】:System call causes Segmentation Fault系统调用导致分段错误
【发布时间】:2014-06-18 00:02:56
【问题描述】:

我正在用汇编语言编写一个简单的程序,它应该调用setreuid(0,0),然后调用exit()。这是我的代码:

section .text ; start code section of assembly
global _start
_start:
xor eax, eax ; setruid call
mov al,  0x46 ; get ready for setreuid system call
xor ebx, ebx ; arg 1 (0)
xor ecx, ecx ; arg 2 (0)
int 0x80 ; interrupt for setreuid
mov al,  0x01 ; prepare for exit call
int 0x80 ; interrupt for exit <---- 0x0804806c

当我通过gdb 运行它时,它会到达0x0804806c,然后它会崩溃并显示以下消息:

0x0804806e 在?? ()
执行不在已知函数内

我是组装新手,如果是菜鸟错误,请见谅。

更新

我已将我在此处发布的内容复制并粘贴到exit.asm。然后我使用以下命令编译了exit.asm

nasm -f elf exit.asm # elf file format for 32-bit linux
ld -o exit exit.o # link

这会产生程序exit。运行它时,我得到以下信息:

****@debian:~/shellcode$ ./exit
Segmentation fault
****@debian:~/shellcode$ 

【问题讨论】:

  • 您应该在第二个系统调用之前将eax 重新归零。第一个系统调用的返回值在那里,如果它设置了mov al, 0x01 不重置的任何位,您最终将调用其他调用。
  • 为什么不只是 mov eax, 0x460x01
  • @AndrewMedico 好主意,我试过了,但它仍然崩溃。
  • @WilliamAndrewMontgomery 我试过了,但仍然出现分段错误。
  • 那么你做错了什么,例如没有运行你的程序的当前版本。

标签: linux assembly x86 32-bit


【解决方案1】:

发生的情况是,setreuid 在成功时返回零,在错误时返回 -1。您可能以普通用户身份运行,不允许设置进程的用户 ID。出于这个原因,setreuid 的返回值为 -1,在二进制中是为 eax 设置的所有位。通过将 al 设置为 0x01,您只需将最低有效字节设置为 1。高位已全部设置,因此您实际上并没有在 eax 中传递 1。你有效地通过了 FFFFFF01。这不是一个有效的系统调用,更不用说退出调用了。当它到达第二个 int 0x80 时,它会继续执行下一条指令,它不允许读取。另一件事是,您应该将 mov ebx, 0 用于退出调用。碰巧您之前对 ebx 进行了异或,但这是一个等待发生的潜在错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2021-05-25
    • 1970-01-01
    • 2021-08-02
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多