堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_写给初学者的IoT实战教程之ARM栈溢出...

84b7fadaebdaa8174fef7708bc1f4bc0.png

本文面向入门IoT 固件分析的安全研究员,以一款ARM路由器漏洞为例详细阐述了分析过程中思路判断,以便读者复现及对相关知识的查漏补缺。 假设读者:了解ARM指令集、栈溢出的基础原理和利用方法、了解IDA、GDB的基础使用方法,但缺少实战漏洞分析经验。 阅读本文后:
  1. 可以知道IoT固件仿真的基础方法及排错思路。
  2. 可以知道对ARM架构栈溢出漏洞的利用和调试方法。
  c1c603fd9dd454ef04131f7372a3dca6.png

1.实验目标概述

为了便于实验,选择一个可以模拟的路由器固件:Tenda AC15 15.03.1.16_multi。分析的漏洞为CVE-2018-5767,是一个输入验证漏洞,远程攻击者可借助COOKIE包头中特制的‘password’参数利用该漏洞执行代码。 测试环境:Kali 2020 5.4.0-kali3-amd64
固件下载地址: https://down.tenda.com.cn/uploadfile/AC15/US_AC15V1.0BR_V15.03.1.16_multi_TD01.zip   c1c603fd9dd454ef04131f7372a3dca6.png

2.固件仿真

首先使用binwalk导出固件文件系统,并通过ELF文件的头信息判断架构,得知为32位小端ARM。
binwalk -Me US_AC15V1.0BR_V15.03.1.16_multi_TD01.zipreadelf -h bin/busybox
40a1300527ca9bec5c27b9d603abd322.png 使用对应的qemu程序(qemu-arm-static),配合chroot启动待分析的目标文件bin/httpd。
#安装qemu和arm的动态链接库sudo apt install qemu-user-static libc6-arm* libc6-dev-arm*cp $(which qemu-arm-static) .sudo chroot ./ ./qemu-arm-static ./bin/httpd
此时发现卡在了如下图的显示,同时检查80端口也并未开启。 1f7e63929bc7100fd90a70472e450c77.png 根据打印的信息“/bin/sh: can’t create /proc/sys/kernel/core_pattern: nonexistent directory”,创建相应目录 mkdir -p ./proc/sys/kernel 。同时在ida中通过Strings视图搜索“Welcome to”字符串,通过交叉引用找到程序执行的上下文。 13419d38596f571690ee140546795b3f.png 可以看到有不同的分支方向,简单分析梳理一下分支的判断条件。在上图中的标号1处,执行check_network函数后会检测返回值(保存在R0中),小于等于零时将执行左侧分支。可以观察到会进行s
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答。 首先,你需要在pubspec.yaml文件中添加wifi_iot依赖: ``` dependencies: wifi_iot: ^0.3.18 ``` 然后,在你的Flutter页面中,你可以使用wifi_iot库提供的`listWifiNetworks()`方法来获取附近的Wi-Fi网络列表。你可以将列表传递给另一个页面,让用户选择要连接的网络。 下面是一个简单的示例,演示如何使用wifi_iot库来列出可用的Wi-Fi网络并选择一个网络: ```dart import 'package:flutter/material.dart'; import 'package:wifi_iot/wifi_iot.dart'; class WifiSelectionPage extends StatefulWidget { @override _WifiSelectionPageState createState() => _WifiSelectionPageState(); } class _WifiSelectionPageState extends State<WifiSelectionPage> { List<WifiNetwork> _wifiNetworks = []; @override void initState() { super.initState(); _getWifiNetworks(); } Future<void> _getWifiNetworks() async { List<WifiNetwork> wifiNetworks = await WifiWizard.listWifiNetworks(); setState(() { _wifiNetworks = wifiNetworks; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Select a Wi-Fi Network'), ), body: ListView.builder( itemCount: _wifiNetworks.length, itemBuilder: (BuildContext context, int index) { return ListTile( title: Text(_wifiNetworks[index].ssid), onTap: () { Navigator.pop(context, _wifiNetworks[index]); }, ); }, ), ); } } ``` 在这个示例中,我们使用了wifi_iot库的`listWifiNetworks()`方法来获取可用的Wi-Fi网络列表,并将它们显示在一个列表视图中。当用户点击一个网络时,我们将所选的网络传递回到调用页面,使用`Navigator.pop()`方法。 希望这可以帮助你实现你的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值