原创 紫色仰望 合天智汇
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 !嗯...我们来看下****的介绍吧,
上面的是 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,知道了上面这些知识,那么做这题,其实相对来说 会容易些了!可能本来大佬们就没觉得难,还求勿喷!基于网上 对这题的题解很少,我调试了很长时间才弄懂!实在是太弱了!
点击“
标签: 合天智汇
还木有评论哦,快来抢沙发吧~