黑客信息网:记一次ARM架构的ROP利用

访客4年前黑客文章1025

  先说一下需要搭建的环境:

  1.安装qemu:sudo apt-get install qemu-user

  2.安装gdb-multiarch:sudo apt-get install gdb-multiarch

  3.安装依赖库:sudo apt install gcc-arm-linux-gnueabi gcc-aarch64-linux-gnu

  然后就可以通过qemu起一个虚拟机模拟arm架构的环境了

  qemu-aarch64 -g 1234 -L /usr/aarch64-linux-gnu

  -g参数表示等待gdb调试连接端口,-L表示加载指定的动态链接库

  启动之后就再起一个终端用gdb-multiarch来进行调试就可以了,指令如下:

  gdb-multiarch arm -q;

  然后在gdb-multiarch界面里输入target remote:1234,就可以进行调试了

  界面如图

  image.png

  在pwntools里可以写成这样的模板,然后就用上面的命令区连接就可以了

  from pwn import *

  import sys

  context.binary=''

  if args[1]=='r':

  p=remote('remote_addr',port)

  if args[1]=='l':

  p=process(["qemu-aarch64","-g","1234","-L","/usr/aarch64-linux-gnu",""])

  elf=ELF('')

  context.log_level='debug'

  pause()

  接下来看下题目,IDA7.0 Pro已经可以支持ARM反编译了,我们就来分析下这个程序,最开始是往bss端上读0x200个字符,然后又往栈里读了0x200个字符,猜测是不是返回到bss端执行shellcode,但是最后发现不是,因为查看bss段后没有x权限。

  __int64 sub_400818()

  {

  sub_400760();

  write(1LL, "Name:", 5LL);

  read(0LL, &unk_411068, 512LL);

  sub_4007F0();

  return 0LL;

  }

  __int64 sub_4007F0()

  {

  __int64 v1; // [xsp+10h] [xbp+10h]

  return read(0LL, &v1, 512LL);

  }

  然后发现函数列表里有mprotect函数

  在这个位置被调用了

  .text:00000000004007E0 BL .mprotect

  .text:00000000004007E4 NOP

  .text:00000000004007E8 LDP X29, X30, [SP],#0x10

  .text:00000000004007EC RET

  所以确定了思路那就是之一次往bss段读数据的时候把shellcode输入进去,然后在栈溢出那里通过ROP用mprotect给bss开权限,然后控制返回地址到bss段写的shellcode上。那接下来就是找gadget。但是满屏幕的汇编让我看不懂,于是我去查了下资料。发现ARM架构里是没有POP和PUSH指令的,他们的指令是这样的。

  image.png

  ARM架构下调用函数的约定是,X0,X1,X2,X3寄存器传递前四个参数,后面的参数从右到左依次入栈。ARM架构下的PC寄存器就相当于x86的IP寄存器,都指向下一条指令的地址,同时BL指令实现了跳转到调用的函数处执行,跳转的同时会存储返回地址到X30寄存器中,在给被调用函数开辟栈帧的时候,会将BL指令存储在X30中的返回地址压入栈中,在调用函数结束后,会将栈里的返回地址弹回给X30寄存器,RET指令会将X30的内容给到PC寄存器。这就是为什么在这个函数的开头会有这个指令

  STP X29, X30, [SP,#-0x10+var_s0]!

  在这个指令执行之后,SP寄存器也就是栈顶指针会-0x10。是!和#-0x10在发挥作用。也就是类似这种在[]后有个!,并且[]里有数字的话,就会将里面寄存器进行运算后将数据写回之一个寄存器,这里SP会用原来的数据-0x10+0后写回SP。或者类似这种

  LDP X29, X30, [SP+var_s0],#0x40

  这种在[]后面还有数字的,在将sp+var_s0偏移处取0x10大小的数据,分成0x8大小的两份数据按顺序放到X29 X30的寄存器中,并且SP指针会+0x40。

  既然清楚了各个指令都做了什么,接下来就是找栈溢出的偏移然后再找gadget。

  那么该如何确定偏移呢

  image.png

  可以看到这个栈溢出函数里,首先将X29,X30两个寄存的值压入栈中同时将栈帧抬高了0x50。然后将当前栈顶指针的值赋值给X29,这里要注意一点,ARM架构下试没有BP栈底指针的,所以在刚调用函数时X29保存的是上一个函数栈帧的状态,压入栈中方便调用完函数后恢复现场。保存好上一个栈帧的状态之后,再把当前栈顶指针赋值给X29寄存器。这里可以看到read的函数时,三个参数分别是0,SP+10,0x200,也就是相当于在往当前栈顶+0x10处读数据,所以可以算出输入位置距离返回地址的偏移

  0x50-0x10+0x8=0x48=72.为什么+0x8是因为x29寄存器也被入栈了。所以还要加八个字节的大小。

  确定偏移之后,就是找gadget了。查阅资料后,发现ARM架构下也有一个万能gadget,

  image.png

  从4008cc开始加载了栈内的数据到x19 x20 x21 x22 x24 x24 x29 x30这八个寄存器里,我们可以通过将返回地址控制到0x4008cc,然后后面的数据我们可以构造好,从而控制x30这个寄存器,ret之后跳回到0x4008ac处执行,会将[X21+X19

相关文章

疯狂手机赚钱可靠吗(手机赚钱软件排行榜)

疯狂手机赚钱可靠吗(手机赚钱软件排行榜)

​ 玩手赚已经一个月了,多少有点心得与大家分享下!以上载图里各种头条都是坑,一天只能撸个一两角钱我五六款同时进行,每小时发个一分钟时间,最多24小时。我一般在线十个小时,也就是一天玩十几分钟,一块钱...

网站渗透入侵实战(网站渗透教程)

网站渗透入侵实战(网站渗透教程)

本文导读目录: 1、如何做好网站入侵渗透测试? 2、网站安全渗透测试怎么做? 3、网站渗透入侵全部教程 4、入侵网站需要什么步骤 5、网站渗透测试怎么做? 如何做好网站入侵渗透测试?...

找回qq聊天记录的软件

试试以下的恢复步骤1)准备:先将手机通过数据线连接电脑;2)下载iTunes以及强力苹果恢复精灵;3)点开恢复工具,进入“从iTunes备份文件恢复”界面菜单后。 如果只是在qq聊天界面删除聊天记录,...

有什么办法查我媳妇历史开房信息

10月29日,广药集团又一精准扶贫成果重磅落地!为贯彻落实广东省委省政府“振兴粤东西北”战略部署和广州市对口帮扶梅州工作安排,广药集团发挥自身产业、科技等优势,大力开展产业帮扶,其中两个重点项目——王...

有别人手机号能定位吗开房记录能查出和谁吗查询短信收发记录有软件查开房记录的吗

有别人手机号能定位吗开房记录能查出和谁吗查询短信收发记录有软件查开房记录的吗淮安,在有的人印象当中,是一座经济落后,交通落后的城市。但是,也有人认为淮安是一座宜居城市,这里环境优美,生活没什么压力,过...

什么是SEO?该做什么?初学者一读就能懂

每天都有新网站、新网页在诞生,这使得网络发展红利期已经微乎其微,甚至早就过去了。换句话说,如果没有掌握到对的营销方法与经营策略,要发展电商根本很难脱颖而出。 所以,今天我想谈谈什么是 SEO? SEO...