ARMpwn绕过姿势:从踩坑到真香,聊聊我实战中总结的那些骚操作
大家好呀!今天想跟你们唠唠ARMpwn绕过姿势这个话题,说实话,刚开始接触ARM架构的pwn题时,我整个人是崩溃的——寄存器名字记不住、指令集看着陌生、保护机制还一堆幺蛾子,但踩坑踩多了,慢慢也就摸出了一些门道,这篇文章就把我实战中积累的ARMpwn绕过姿势整理一下,希望能帮到正在被ARM折磨的你。

为啥ARMpwn的绕过这么让人头大?
先吐个槽哈,x86的pwn题咱们做多了,pop rdi; ret这种gadget闭着眼睛都能找,但换到ARM上,好家伙,寄存器变成R0-R15,返回地址放在LR里,指令还是定长的……第一次做的时候我甚至连怎么控制PC都搞了半天,真的裂开。
而且ARM平台上的保护机制跟x86还不太一样,NX、ASLR、PIE这些虽然概念相同,但利用手法差别挺大的,尤其是ROP链的构造,ARM的gadget跟x86完全不是一个画风,你得重新适应。
ARMpwn常见的几种绕过姿势
基础ROP:找对gadget是关键
ARM下的ROP,核心思路还是控制LR或者PC,因为ARM用LR(R14)存返回地址,所以溢出后覆盖LR就能劫持执行流,找gadget的时候要注意,ARM指令是4字节对齐的,有时候还能跳到Thumb模式(2字节对齐),这就给了我们更多骚操作的空间。
我一般用ROPPER或者自己写脚本找gadget,比如pop {r0, pc}这种就很香,如果能找到直接控制R0的gadget,调用system就方便多了。
绕过NX:ret2libc依然是老朋友
NX保护开了也不慌,ARM平台上ret2libc照样能用,关键是要泄露出libc基址,然后算出system和/bin/sh的地址,不过要注意,ARM下调用函数时参数是放在R0-R3的,所以你得先想办法把/bin/sh的地址塞进R0。
这里有个小技巧:如果找不到pop r0; pc,可以试试找mov r0, sp; ...这类gadget,或者利用栈迁移把参数布置好。
绕过ASLR:信息泄露是王道
ASLR这东西在ARM上一样烦人,但绕过思路跟x86差不多——先泄露一个地址,算出基址,再构造ROP,常见的泄露点有write、puts这些函数,或者直接读GOT表,不过ARM的GOT表布局跟x86不同,得先熟悉一下ELF结构。
Thumb模式:意想不到的绕过点
这个真的要重点说!ARM处理器支持ARM和Thumb两种指令集,切换的时候地址最低位会变,有时候你明明跳到了正确的地址,但因为没有设置Thumb位,程序直接崩了,反过来,如果你能利用Thumb模式,还能绕过一些简单的检查,我第一次遇到的时候完全懵了,后来才知道要看地址的LSB。
实战中的一些小tips
- 多用qemu+gdbserver调试:ARM环境不像x86那么方便,qemu配合gdb是标配,多打断点看寄存器状态。
- 注意字节序:ARM一般是小端,但有些场景下大端也会出现,别搞混了。
- gadget不一定非要ret结尾:ARM里
bx lr、pop {pc}都能用,灵活一点。 - 多看大佬的writeup:我很多姿势都是从CTF的题解里学来的,真的香。
最后说两句
ARMpwn绕过姿势这东西,说白了就是多练多看多踩坑,刚开始觉得难很正常,我当初也是一脸懵逼,但做多了就会发现套路其实就那么几种,关键是要理解ARM的架构特性,然后灵活运用。
好了,今天就唠到这吧,如果你也在搞ARMpwn,欢迎一起交流呀!有啥问题评论区见,我看到都会回的,咱们下篇文章再见,拜拜!