前言

最近在安全客上看到一篇文章PIE保护详解和常用bypass手段,里面提到了3种绕过PIE保护机制的方式:partial write泄露地址vdso/vsyscall。由于之前对vdso/vsyscall机制了解的不多,于是花了点时间动手实践,以下是对题目1000levels的简单分析。

1000levels

程序分析

该程序提供的功能如下。

阅读全文 »

前言

通常,在对IoT设备的固件进行分析时,固件中与提供服务如HTTPTelnetRTSPUPnP等相关的二进制程序是重点分析的对象。因为一旦在这些程序中发现漏洞,其很有可能会被远程利用,进而带来严重的安全隐患。

对固件二进制程序进行分析,常见的分析方法包括模糊测试补丁比对工具静态扫描人工审计等。其中,模糊测试方法具备简单易用的特点,通常也比较有效,其在业界已被广泛使用。

阅读全文 »

前言

在对IoT设备进行安全分析时,通常设备对我们而言像个”黑盒子”,通过给它提供输入然后观察它的反馈输出,而对设备的”内部”并不了解。如果能够通过某种方式进入设备”内部”,获取到设备的shell,则会对后续的分析提供极大的便利。

阅读全文 »

漏洞简介

CVE-2018-0296是思科ASA设备Web服务中存在的一个拒绝服务漏洞,远程未认证的攻击者利用该漏洞可造成设备崩溃重启。该漏洞最初由来自Securitum的安全研究人员Michal Bentkowski发现,其在博客中提到该漏洞最初是一个认证绕过漏洞,上报给思科后,最终被归类为拒绝服务漏洞。据思科发布的安全公告显示:针对部分型号的设备,该漏洞可造成设备崩溃重启;而针对其他型号的设备,利用该漏洞可获取设备的敏感信息,造成信息泄露。

阅读全文 »

re1

使用file命令查看文件类型,如下:

1
2
$ file re1.exe
re1.exe: PE32 executable (console) Intel 80386, for MS Windows

运行该程序,提示输入flag,随机输入内容后程序退出。

利用IDA Pro加载程序进行分析,main()函数的主要逻辑如下:读取输入的flag(长度为22),然后对flag内容进行一系列判断,如strcmp()check()以及调用v10v11v12指向的函数等。

阅读全文 »

前言

最近看了@小黑猪的一篇关于TP-Link wr886nv7固件初步分析的文章,由于之前很少分析基于VxWorks系统的固件,所以按照文章的思路动手重现了一下整个过程。

使用binwalk 初步分析

从TP-Link官网下载wr886的固件,由于没有找到v7版本的固件,所以下载的是v6版本的固件。对下载的压缩包进行解压,然后使用binwalk对文件wr886nv6.bin进行分析,如下。

阅读全文 »

off-by-one 原理

严格来说,off-by-one漏洞是一种特殊的溢出漏洞,指程序向缓冲区中写入时,写入的字节数超过了缓冲区本身的大小,并且只越界了一个字节。这种漏洞的产生往往与边界验证不严或字符串操作有关,当然也有可能写入的size正好就只多了一个字节:

  • 使用循环语句向缓冲区中写入数据时,循环的次数设置错误导致多写入一个字节
  • 字符串操作不合适,比如忽略了字符串末尾的\x00
阅读全文 »

背景

baby_mips是DDCTF 2018 逆向的第1题,是MIPS指令架构的。MIPS指令架构是一种采用精简指令集的处理器架构,常用于路由器等嵌入式设备中。

静态分析

使用file命令查看文件格式,如下。可以看到程序为MIPS架构 小端格式,同时是通过静态链接生成的。

1
2
$ file baby_mips
baby_mips: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, stripped
阅读全文 »

堆溢出原理

相比栈溢出而言,堆溢出的原理类似,但是堆溢出的利用则更复杂,因为glibc堆管理机制比较复杂。

堆溢出的利用主要围绕在binfree chunk的合并过程,在两个free chunk的合并过程中,有两次改写地址的机会。例如,对于将要合并的chunk P,在合并发生时,glibcchunk Pbinlistunlink掉,其中涉及到以下指针操作:

1
2
3
4
FD = P -> fd;  // FD为相对于P下一个chunk的地址
BK = P -> bk; // BK为相对于P上一个chunk的地址
FD -> bk = BK; //用上一个chunk的地址去改写下一个chunk的前向指针bk,即改写FD+12(32 bits)或FD+24(64 bits)地址中的内容
BK -> fd = FD; //用下一个chunk的地址去改写上一个chunk的后向指针fd,即改写BK+8(32 bits)或BK+16(64 bits)地址中的内容
阅读全文 »
0%