ctf中关于syscall系统调用的简单分析

访客 418 0
本文来源:ctf中关于syscall系统调用的简单分析

原创 紫色仰望 合天智汇

0x01

我在动态调试这个程序的时候,发现 syscall调用 系统函数 的过程很有趣,于是便记录下来 希望对大家 能带来些帮助,这里 以 buu 平台上的 ciscn_2019_s_3 为例,给大家详细地分享以及分析下!

0x02

在开始之前,我们先来认真 学习下 read(),write()的 原型:

read():
  ssize_t read(int fd,const void *buf,size_t nbytes); 
  //fd 为要读取的文件的描述符  0
  //buf 为要读取的数据的缓冲区地址 
  //nbytes 为要读取的数据的字节数

  //read() 函数会从 fd 文件中读取 nbytes 个字节并保存到缓冲区 buf,
 //成功则返回读取到的字节数(但遇到文件结尾则返回0),失败则返回 -1。

write() 
  ssize_t write(int fd,const void *buf,size_t nbytes);
  //fd 为要写入的文件的描述符  1 
  //buf 为要写入的数据的缓冲区地址
  //nbytes 为要写入的数据的字节数 

 //write() 函数会将缓冲区 buf 中的 nbytes 个字节写入文件 fd,
 //成功则返回写入的字节数,失败则返回 -1。

0x03

然后我们再来简单了解下 syscall !嗯...我们来看下****的介绍吧,

ctf中关于syscall系统调用的简单分析-第1张图片-网盾网络安全培训

上面的是 32 位的系统调用,而64位系统的系统调用总体思想还是一样的,当然也会有些不同,

32位与64位 系统调用的区别:

1. 传参方式不同

2. 系统调用号 不同

3. 调用方式 不同

32位:

传参方式:首先将系统调用号 传入 eax,然后将参数 从左到右 依次存入 ebx,ecx,edx寄存器中,返回值存在eax寄存器

调用号:sys_read 的调用号 为 3 sys_write 的调用号 为 4

调用方式: 使用 int 80h 中断进行系统调用

64位:

传参方式:首先将系统调用号 传入 rax,然后将参数 从左到右 依次存入 rdi,rsi,rdx寄存器中,返回值存在rax寄存器

调用号:sys_read 的调用号 为 0 sys_write 的调用号 为 1

stub_execve 的调用号 为 59 stub_rt_sigreturn 的调用号 为 15

调用方式: 使用 syscall 进行系统调用

Ok,知道了上面这些知识,那么做这题,其实相对来说 会容易些了!可能本来大佬们就没觉得难,还求勿喷!基于网上 对这题的题解很少,我调试了很长时间才弄懂!实在是太弱了!

点击“

标签: 合天智汇

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~