ida反编译后查找函数外部库方法
ida反编译后查找函数外部哪个库方法研究路由器固件时,这个函数调用外部函数库中的 usrGetPass :
切换到固件根目录后:
1grep -rn "usrGetPass"
匹配出含有 usrGetPass 的文件,第一个是分析的文件,第二个就是要找的动态函数库。
在 ida 开头也有记录需要哪些外部函数库:
CVE-2018-5767 栈溢出漏洞复现
TENDA-AC15 型号路由器上的一个漏洞,产生原因是没有限制用户输入,使用 sscanf 直接将输入拷贝到栈上,导致栈溢出。
复现环境
漏洞固件在官网没找着,去百度找到了,地址在这里
版本号:V15.03.1.16
qemu v5.2
Ubuntu 18.04
ida 7.5
漏洞分析需要配置好 qemu 桥接网络,不能就去 patch 一下 check_network 的返回值。
设置桥接网络安装依赖:
1sudo apt-get install bridge-utils uml-utilities
修改 /etc/network/interfaces 网卡配置文件如下:
12345678910111213# interfaces(5) file used by ifup(8) and ifdown(8)auto loiface lo inet loopbackauto ens33iface ens33 inet manualup ifconfig ens33 0.0.0.0 upauto br0iface br0 inet dhcpbridge_ports en ...
CNVD-2018-01084 远程代码执行复现
Dlink DIR 615/645/815 路由上远程代码执行漏洞。漏洞存在于 /htdocs/cgibin 二进制文件中,原因是 service.cgi 中未经过滤就将用户输入拼接到命令中。
复现环境
漏洞固件 Firmware:DIR-645_A1_FW: v1.02b08 (for WW) (tw官网选择 DIR-645 第一个文件)版本号为 v1.02(v1.03完成修复)
qemu v5.2
Ubuntu 18.04
ida 7.5(能搞 mips 反编译工具都行)
直接运行如下:
漏洞分析strrchr 匹配出 / 后面的参数后,strcmp 匹配参数进入各个服务函数:
定位到 servicecgi_main 。getenv 提取参数依据两种请求方式分别给 v2 赋值,不匹配或为空则退出;提取请求方式后,将参数传入 cgibin_parse_request 解析 http 请求:
到里面分别提取REQUEST_URI、 CONTENT_TYPE、CONTENT_LENGTH ,
当解析无误后返回上层函数,然后进入权限认证:
在这个认证函数内部的函数 sess_ ...
IOT环境配置V1&入门练习
简介这里 IOT 环境主要是指路由器的分析环境,当然摄像头之类的设备也是能够进行分析的。
下面配置是基于 ubuntu18.04 进行配置。
Binwalkapt-get install 的 binwalk 是残缺版本,解析某些压缩固件时识别不了。因此选择到 github 仓库安装完整版本:
https://github.com/ReFirmLabs/binwalk/
apt 装的差点解释器,对于 ubuntu\debian 有提供一键脚本,安装的内容查阅官方文档。py2 和 py3 都支持,py3 速度快点就装它了,手动安装方法看前面官方文档。
123456git clone --depth 1 https://github.com/ReFirmLabs/binwalk.gitcd binwalk# 安装binwalksudo python3 setup.py install# 安装拓展sudo ./deps.sh
其中 cramfsprogs 无法 apt 安装,要手动装下:
参考师傅文章:https://blog.csdn.net/wuyou1995/article/de ...
沙盒堆溢出学习
在复现 SWPUCTF2020 jailbreak 遇到打开沙盒堆溢出题目,这条题目实际上还有 chroot 逃逸,这个先放后面。沙盒堆溢出利用方法关键是 setcontext() ,以这个点搜寻其他同类题目。年前的高校战役 lgd ,七月份 DASCTF bigbear 。
setcontext1234567// stdlib/setcontext.c#include <errno.h>#include <ucontext.h>int setcontext(const ucontext_t *ucp){ ……};
其作用是用户上下文的设置,所以我们在可以小范围控制执行流,已知 libc_base 但不足以完成我们的目标时,可以先跳 setcontext+53 来扩大控制范围。简单来说就是通过 setcontext 控制寄存器的值。
setcontext+53 避免 crashlibc 2.27 下完整 setcontext 如下:
12345678910111213141516171819202122232425262728293031 ...
HWS冬令营选拔赛部分Writeup
Pwnemarm基本情况Aarch64 题目没有打开 pie 。程序存在一个任意地址写入:
随机数验证输入 \x00 绕过。
远程是用 qemu 部署,地址不随机。第一次泄露地址,第二次 getshell 。
利用任意地址写,将 atoi got 改为 printf ,在 main 函数控制 atoi 参数实现格式化字符串泄露出栈上 got 表信息。
第二次就讲 atoi 修改为 system 参数为 /bin/sh\x00
EXP123456789101112131415161718192021222324252627282930313233343536373839404142from pwn import *import syscontext.log_level = "debug"context.binary = "emarm"if sys.argv[1] == "r": p = remote("183.129.189.60", 10012)elif sys.argv[1] == " ...
Pwn _IO_FILE
IO 结构体知识_IO_FILE 结构FILE 在 Linux 系统的标准 IO 库中是用于描述文件的结构,称为文件流。 FILE 结构在程序执行 fopen 等函数时会进行创建,并分配在堆中。我们常定义一个指向 FILE 结构的指针来接收这个返回值——文件描述符(eg:stdin=0;stdout=1)。
在标准 I/O 库中,每个程序启动时有三个文件流是自动打开的:stdin、stdout、stderr,分别对应文件描述符:0、1、2。假设现在第一次用 fopen 打开一个文件流,这个文件流的文件描述符就为 3 。默认打开的三个文件流分配 libc data 段。fopen 等文件流控制函数创建的文件流是分配在堆上。
FILE 结构体定义在 libio.h :
123456789101112131415161718192021222324252627282930313233343536373839404142struct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags ...
glibc2.24下IO_FILE的利用
glibc 2.24 下 IO_FILE 的利用介绍在 2.24 版本的 glibc 中,全新加入了针对 IO_FILE_plus 的 vtable 劫持的检测措施,glibc 会在调用虚函数之前首先检查 vtable 地址的合法性。首先会验证 vtable 是否位于_IO_vtable 段中,如果满足条件就正常执行,否则会调用_IO_vtable_check 做进一步检查。
12345678910111213141516171819/* Check if unknown vtable pointers are permitted; otherwise, terminate the process. */void _IO_vtable_check (void) attribute_hidden;/* Perform vtable pointer validation. If validation fails, terminate the process. */static inline const struct _IO_jump_t *IO_validate_vtable ...
劫持 fileno 控制文件流
先来了解一下 linux 的 file 文件结构,fileno 等概念。
_IO_FILE 结构FILE 在 Linux 系统的标准 IO 库中是用于描述文件的结构,称为文件流。在标准 I/O 库中,每个程序启动时有三个文件流是自动打开的:stdin、stdout、stderr,分别对应文件描述符:0、1、2。后续再打开文件对应的文件描述符就从 3 开始,当然可以用 dup2 修改。
每个文件流都有自己的 FILE 结构体。结构体内容如下:
123456789101112131415161718192021222324252627282930313233343536373839404142struct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags. */#define _IO_file_flags _flags /* The following pointers correspond to the C++ streambuf protocol. */ /* Note ...
House of orange
https://bbs.ichunqiu.com/thread-59550-1-1.html
概述house of orange 特殊之处是题目没有 free 函数等释放堆块函数。house of orange 核心思想通过漏洞实现 free 的效果。
使用条件
能控制 topchunk size 位(堆溢出等)
能控制堆分配的大小
原理当 topchunk 不能满足申请分配的大小时,topchunk 被释放进 unsortedbin ,实现没有 free 函数释放堆块。
扩展堆空间有 mmap 和 brk 两种方式,我们需要以 brk 拓展,需要绕过 libc 一些 check :malloc 申请大小不能大于 mmp_.mmap_threshold
1if ((unsigned long)(nb) >= (unsigned long)(mp_.mmap_threshold) && (mp_.n_mmaps < mp_.n_mmaps_max))
总结伪造 topchunk 要求:
伪造 size 需要对齐内存页
比如现在 topchunk si ...