Arm Pwn 初体验
Example
2018上海大学生网络安全赛 baby_arm
checksec
1 | [*] '/home/tty18pwn/Desktop/baby_arm/pwn' |
开启了NX
Aarch64 Registers
Analysis
1 | __int64 main() |
1 | ssize_t vuln() |
很明显的栈溢出,但是由于没有现成的后门,而且开启了NX,所以需要绕过
所幸程序 提供了.mprotect, 该函数把以start地址开始的、长度为len的内存区的保护属性修改为prot指定的值 。bss段本来是不可执行的,我们可以改成可执行。IDA中看到bss_var地址为0x0411068,从这开始改就行
利用思路:
- 将shellcode写入bss段
- 通过栈溢出劫持控制流调用mprotect打开bss段权限
- rop调转到之前bss变量的地址去执行shellcode
由于用寄存器传参,x86-64中需要寻找pop rdi; ret这种gadgets来劫持参数。arm中同样, X0~X7寄存器用于传递子程序参数,多余参数才采用堆栈传递 。可以通过ROPgadget --binary pwn --only "ldp|ret"
来寻找gadgets。
下列函数都有gadgets可用
- _init
- _start
- call_gmon_start
- deregister_tm_clones
- register_tm_clones
- __do_global_dtors_aux
- frame_dummy
- __libc_csu_init
- __libc_csu_fini
- _fini
Exp
1 | # exp.py |