ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux-汇编和系统调用

2019-10-12 19:50:27  阅读:199  来源: 互联网

标签:x86 linux assembly system-calls


我在理解组装中更复杂的系统调用时遇到了一些麻烦.我写了一个exec系统调用,效果很好

 .bss

.text

.globl _start

_start:

#exit(0) system call

        movl $1, %rax
        movl $0, %rbx
        int $0X80

虽然我有一点保证,但还无法找到有关如何将字符串放入寄存器的信息.因此,作为一个示例,我想执行一个exec系统调用,它作为第一个参数需要运行文件名,并且我想运行“ / bin / bash”,但是如何在rbx中获取它.我什至不知道我必须使用rbx,在X86中我知道我将使用ebx,在amd64 ebx = rbx,ecx = rcs等中是否存在相同的关系.

int execve(const char * filename,char * const argv [],
char * const envp []);

谢谢大家

解决方法:

这是在汇编的这些方面快速取得进展的技巧:让C编译器向您展示它是如何实现的!编写一个可以执行您想要的工作的C程序,然后键入gcc -S.

例:

Manzana:ppc pascal$cat t.c
#define NULL ((void*)0)
char *args[] = { "foo", NULL } ;
char *env[] = { "PATH=/bin", NULL } ;


int execve(const char *filename, char *const argv[], char *const envp[]);

int main()
{

  execve("/bin/bash", args, env);

} 

然后:

Manzana:ppc pascal$gcc -S -fno-PIC t.c  # added no-PIC for readability of generated code
Manzana:ppc pascal$cat t.s
.globl _args
    .cstring
LC0:
    .ascii "foo\0"
    .data
    .align 2
_args:
    .long   LC0
    .long   0
.globl _env
    .cstring
LC1:
    .ascii "PATH=/bin\0"
    .data
    .align 2
_env:
    .long   LC1
    .long   0
    .cstring
LC2:
    .ascii "/bin/bash\0"
    .text
.globl _main
_main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $_env, 8(%esp)
    movl    $_args, 4(%esp)
    movl    $LC2, (%esp)
    call    _execve
    leave
    ret
    .subsections_via_symbols

标签:x86,linux,assembly,system-calls
来源: https://codeday.me/bug/20191012/1902922.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有