当前位置: 首页 > 面试题库 >

程序集的sys_execve系统调用

苍轶
2023-03-14
问题内容

asm_execve.s:

.section .data
file_to_run:
.ascii“ / bin / sh”

.section .text
.globl主

主要:
    Pushl%ebp
    move%esp,%ebp
    subl $ 0x8,%esp#两个指针组成的数组。数组[0] = file_to_run数组[1] = 0

    movl file_to_run,%edi
    movl%edi,-0x4(%ebp)   
    movl $ 0,-0x8(%ebp)

    movl $ 11,%eax#sys_execve
    movl file_to_run,%ebx#要执行的文件       
    leal -4(%ebp),%ecx#命令行参数
    movl $ 0,%edx#环境块
    整数$ 0x80

    离开
    退回

生成文件:

NAME = asm_execve
$(NAME):$(NAME).s
    gcc -o $(NAME)$(NAME).s

程序已执行,但未调用sys_execve:

alex @ alex32:〜/ project $ make
gcc -o asm_execve asm_execve.s
alex @ alex32:〜/ project $ ./asm_execve 
alex @ alex32:〜/ project $

预期输出为:

alex @ alex32:〜/ project $ ./asm_execve 
$出口
alex @ alex32:〜/ project $

该Assembly程序应该像以下C代码一样工作:

char * data [2];
data [0] =“ / bin / sh”; 
数据[1] = NULL;
execve(数据[0],html" target="_blank">数据,NULL);

系统调用参数有问题吗?


问题答案:

execve系统调用 被调用,但你确实传递错误参数。

(您可以通过使用运行可执行文件来查看此内容strace。)

存在三个问题:

  1. .ascii不以0结尾的字符串。(您可能会很幸运,因为.data在此示例中的本节中没有任何内容,但是不能保证…)添加0或使用.asciz(或.string)代替。

  2. movl file_to_run, %edi移动的值 指向 由所述file_to_run符号到%edi,即,第一个4个字节的字符串(0x6e69622f)。字符串的 地址 只是符号本身的值,因此您需要对$字面值使用前缀:movl $file_to_run, %edi。同样,您需要说movl $file_to_run, %ebx几行。(这是AT&T语法和Intel语法之间常见的混淆源!)

  3. 参数以错误的顺序放在堆栈上:-0x8(%ebp)比的地址低-0x4(%ebp)。因此,应该将命令字符串的地址写入-0x8(%ebp),将0写入-0x4(%ebp),将leal指令写入leal -8(%ebp), %ecx

固定代码:

.section .data
file_to_run:
.asciz       "/bin/sh"

.section .text
.globl main

main:
    pushl %ebp
    movl %esp, %ebp
    subl $0x8, %esp         # array of two pointers. array[0] = file_to_run  array[1] = 0

    movl $file_to_run, %edi
    movl %edi, -0x8(%ebp)   
    movl $0, -0x4(%ebp)

    movl $11, %eax                      # sys_execve
    movl $file_to_run, %ebx              # file to execute       
    leal -8(%ebp), %ecx                 # command line parameters
    movl $0, %edx                       # environment block
    int  $0x80

    leave
    ret


 类似资料:
  • 问题内容: 如何查看Java程序正在执行的系统?有没有可以在Linux上执行此操作的工具? 问题答案: 使用strace:

  • 问题内容: 在学习“汇编语言”(在Linux中,使用GNU作为汇编语言的x86体系结构)的同时,其中一件令人惊奇的事情是可以使用系统调用。这些系统调用非常方便,有时甚至需要在程序在用户空间中运行时使用。 但是,系统调用在性能方面相当昂贵,因为它们需要中断(当然还有系统调用),这意味着必须从用户空间中当前的活动程序到内核空间中运行的系统进行上下文切换。 我要说的是:我目前正在实现一个大学项目的编译器

  • 本章描述 Linux 内核中的系统调用概念。 系统调用概念简介 - 介绍 Linux 内核中的系统调用概念 Linux 内核如何处理系统调用 - 介绍 Linux 内核如何处理来自于用户空间应用的系统调用。 vsyscall and vDSO - 介绍 vsyscall 和 vDSO 概念。 Linux 内核如何运行程序 - 介绍一个程序的启动过程。 open 系统调用的实现 - 介绍 open

  • 我一直收到这个间歇性的错误,即使只是投票应用程序。我的应用程序相当简单,至少目前,它只是通过JSON向jQuery表提供一个小csv文件。下面列出了回溯和我的系统配置。提前感谢! 回溯(最后一次调用):文件“manage.py”,第14行,在execute_manager(设置)文件“/home/baldig/shared_libraries/centos64/pkgs/python/2.6.5/

  • 我在我的项目中使用的是umbraco 4.11.3。我的项目在Windows 7上运行良好,并在visual studio 2012上运行。但它在Win 8中从visual studio 2012运行时并不工作! 错误是: 无法加载文件或程序集“System.Web”。Mvc,Version=2.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e

  • 我正在尝试理解这些调度算法: 先到先得(FCFS) 最短作业优先(SJF) 最短剩余时间(SRT) 循环赛(RR) 因此,给定一些输入: FCFS将安排为。 我似乎无法弄清楚其余的。有人可以帮助我解释差异吗? 我试过谷歌搜索,但我为SJF得到的结果有点令人困惑。