先看看下面通过系统调用实现的hello world代码:

.section .data
msg:.ascii "Hello world!\n"
.section .text
.globl _start
_start:movl $4, %eax            ; 此为系统调用号,通过系统调用号,我们可以确定这次系统调用是为了使用write函数movl $1, %ebx           ; write函数的第一个参数,是文件描述符movl $msg, %ecx        ; write函数的第第二个参数,是输出字符串的地址movl $13, %edx         ; write函数的第三个参数,是输出字符串的长度int $0x80                       ; 开始系统调用movl $1, %eaxmovl $0, %ebxint $0x80

系统调用是通过int 0x80来实现的,eax寄存器中为调用的功能号,ebx、ecx、edx、esi等等寄存器则依次为参数,从 /usr/include/asm/unistd.h中可以看到exit的功能号_NR_exit为1,write(_NR_write)功能号为4,因此第一个int 0x80调用之前eax寄存器值为4,ebx为文件描述符,stdout的文件描述符为1,ecx则为buffer的内存地址,edx为buffer长度。第二个int0x80之前eax为1表示调用exit,ebx为0表示返回0。

系统调用和函数调用的参数传递方式具体可以参考:
系统调用和函数调用的参数传递方式

系统调用功能号

这部分可以参考:

  1. https://asm.sourceforge.net/syscall.html#2
  2. Linux System Call Table
  3. LINUX SYSTEM CALL TABLE FOR X86 64
    调用功能号放在了/usr/include/asm/unistd.h之中,打开文件找到(我没找到)。
    总共有383条,就不细细讲述了

总的来说,操作系统是根据系统调用功能号来判断系统调用的功能的,所以要想程序按照我们设想的方式运行,就要正确地在eax中存放系统调用功能号,并且正确地填写系统调用的其他参数,才能实现功能。

execve函数详解

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

寄存器eax放execve的系统调用号11;
寄存器ebx放文件路径,即第一个参数;
寄存器ecx放第二个参数,是利用数组指针把内容传递给执行文件,并且需要以空指针(NULL)结束;
寄存器edx放最后一个参数,为传递给执行文件的新环境变量数组。

int 0x80:中断
执行系统调用函数execve()时,execve()通过int 0x80指令进入系统调用入口程序,并且把系统调用号11放入eax中,接着把参数放入ebx,ecx和edx中。

实例展示

#include<unistd.h>int main(){char *argv[]={"ls","-al","/etc/passwd",NULL};char *envp[]={"PATH=/bin",NULL};execve("/bin/ls",argv,envp);   return 0;
}

执行后如图:


参考链接:
BUUCTF刷题——others_shellcode
int 80h系统调用方法

系统调用功能号与execve函数详解相关推荐

  1. linux系统调用:exit()与_exit()函数详解【转】

    (转自:https://blog.csdn.net/drdairen/article/details/51896141) exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示 ...

  2. linux系统调用:exit()与_exit()函数详解

    exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_ ...

  3. MATLAB的iptcheckinput函数详解

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 iptcheckinput函数详解,这个函数在看 ...

  4. linux 系统函数调用脚本文件,Linux系统调用fsync函数详解

    Linux系统调用fsync函数详解 发布时间:2013-11-14 19:55:10   作者:佚名   我要评论 Linux fsync函数主要用于将同步内存中所有已修改的文件数据到储存设备,多用 ...

  5. linux中recvfrom读取速度,Linux系统调用-- recv/recvfrom 函数详解

    Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...

  6. Linux系统调用-- recv/recvfrom/recvmsg函数详解(转)

    Linux系统调用-- recv/recvfrom/recvmsg函数详解 2007-09-10 23:37 [recv/recvfrom/recvmsg系统调用]   功能描述: 从套接字上接收一个 ...

  7. linux内核 recvfrom,Linux系统调用-- recv/recvfrom 函数详解

    Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...

  8. Linux 文件锁 fcntl 函数详解

    Linux 文件锁 fcntl 函数详解 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...

  9. 常用socket函数详解

    常用socket函数详解 关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄 ...

最新文章

  1. 把控制台程序嵌入到 WinForm 中执行
  2. 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程)
  3. [ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?
  4. python怎么设置notebook_JupyterNotebook设置Python环境的方法步骤
  5. 如何查看注解实现_SpringBoot的注解@ConditonOnClass注解是如何实现的?
  6. JMeter使用教程-压测
  7. kaggle竞赛——泰坦尼克号获救
  8. 使用51单片机驱动航模无刷电机
  9. 【打印机】连接共享打印机找不到网络路径解决方案
  10. TMS570-4-RTI_DWD看门狗
  11. 求会java的大佬救一下场,领导让研究一个应用信息导出工具的代码实现原理,我之前没系统学过java,来个会的大佬帮忙解释下哈,跪谢...这个如果只是单纯实现抓取包名,应用名称的话代码可以怎么精简呀?
  12. HPS SoC和FPGA联合使用例程
  13. ntpdate解决同步时间报错:the NTP socket is in use, exiting
  14. MAVEN踩坑 Could not find artifact...
  15. 日记:2011年6月深圳2周找工作总结
  16. 复杂美区块链溯源系统架构
  17. datasets: mnist
  18. Android开发关键知识点讲解
  19. KSDK2.0 + Pins Tool 体验
  20. 安卓apk版本检测下载升级全过程

热门文章

  1. windows部署hadoop环境
  2. 石河子大学师生为荣获2018年“马云乡村教师奖”校友点赞
  3. clickhouse多副本
  4. 拿什么拯救你——王阿姨的少女心!
  5. 【dotnet跨平台】微软昨天宣布正式发布.NET Core RC2和.NET Core SDK Preview 1,还有Entity Framework Core RC2
  6. python if else写在一行_关于python:将if-elif-else语句放在一行上?
  7. java熔断器_详解spring cloud分布式关于熔断器
  8. RTThread从底层AT组件到上层SAL之间的关系
  9. 人机猜拳游戏(修改)
  10. golang读写文件的几种方式