ARM程序漏洞挖掘.pptx

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ARM 程序的漏洞挖掘;About me;CTF中的ARM程序;安装gdbserver 因为镜像版本太旧,官方的更新源中已经没有合适版本的软件包,解决方法是替换更新源,替换成官方的存档更新源 nano /etc/apt/sources.list: 然后 apt-get update 更新, apt-get install gdbserver 安装 ;ARM架构版本:https://en.W/wiki/List_of_ARM_microarchitectures ARM参考手册:/help/topic/com.arm.doc.dui0068b/index.html ARM汇编工具:/software/binutils 学习网站: (树莓派+qemu) 练习题:/azeria-labs/ARM-challenges /xairy/easy-linux-pwn/ 电子书:《The Definite Guide to ARM Exploitation》 ;CTF中的ARM;ARM 32 LSB,statically linked,stripped;一个简单的打字游戏,超长的输入导致栈溢出 思路:程序仅开启了NX,且是静态链接,可以直接利用 rop 构造 system(“/bin/sh”) 。程序在编译时去除了符号,使用 rizzo、bindiff 等工具恢复部分符号 system:0x10BA8;构造ROP ;for i in range(112, 113): payload = a * i + p32(0x20904) + p32(0x6c384) * 2 + p32(0x110B4);ARM 64;安装 aarch64 的汇编器: $ sudo apt search binutils| grep aarch64 $ sudo apt-get install binutils-aarch64-linux-gnu 安装 aarch64 的 libc: $ sudo apt-cache search libc6- | grep arm“ $ sudo apt install libc6-arm64-cross ;首先找到输入点,首先会通过 read() 将用户输入写入到 unk_411068 所在的bss段,然后再向栈上写入 而在 sub_4007F0 函数中向栈上写入时,目标缓冲区 v1 是一个 int64 类型的变量,在栈上仅分配 8 bytes 的内存空间,而通过 read 向这块内存写入了 512 bytes,明显会导致栈溢出: ;程序开启了 NX,常规思路是 ROP,在 plt 表中寻找可以覆盖的函数: int mprotect (const void *start, size_t len, int port) 把从 start 开始的,长度为 len 的内存区的保护属性修改为 port 指定的值: PROT_READ:表示内存段内的内容可写 PROT_WRITE:表示内存段的内容可读 PROT_EXEC:表示内存段中的内容可执行 PROT_NONE:便是内存段中的内容无法访问 需要注意,指定的内存区间必须包含整个内存页(4K),区间开始的地址 start 必须是一个内存页的起始地址,并且区间长度 len 必须是页大小的整数倍;利用: 1、通过第一个 read 操作向 bss 段中写入 shellcode(不可执行) 2、通过第二次 read 操作溢出构造 rop 链,调用 mprotect 设置可执行 3、通过 rop 跳转到 bss 段执行 shellcode 简单的 gadget 工具: objdump、ROPEME、Ropper、ROPgadget、rp++ 在这个程序中,涉及到 aarch64 传参的方式,需要控制三个参数 x0、x1、x2,程序本身的函数中找不到可用 rop 链,而我们也不知道目标服务器上 libc.so 的版本,所以我们采用通用 gadget,这种技术也叫 ret2csu 通常,在调用了 libc.so 的程序中,都会用到 __libc_csu_init() 这个函数来对libc进行初始化;通用Gadget:;qemu-user模式模拟: $ sudo qemu-aarch64 -g 1234 -L /usr/aarch64-linux-gnu ./baby_arm -g 参数:在本地开启指定调试端口 -L 参数:指向程序依赖的共享库 pwndbg远程连接端口调试: $ gdb-multiarch ./baby_arm pwndbg target remote :1234 ...下断点 pwndbg continue;IOT中的ARM;Tenda

文档评论(0)

文先生 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8047000056000024

1亿VIP精品文档

相关文档