为什么要写这篇教程呢?
本文章仅提供学习,切勿将其用于不法手段!
因为想要成为一名白帽黑客,汇编语言是必须要掌握的!
无论是二进制漏洞挖掘,还是逆向工程!汇编语言,都是硬性基础之一!当然,你还需要学会C语言!为什么要学会C语言呢?IDA软件 会将 二进制代码 翻译成 汇编语言 和 C语言 !
你不会汇编语言,不会C语言,想要进行逆向工程,以及更深层次的 二进制漏洞挖掘,是非常困难!如果你希望挖掘 二进制漏洞 ,你还要学会 代码审计 !
你必须看得懂,汇编语言代码 和 C语言代码,这是硬性要求!
想要参加CTF竞赛,汇编语言 和 C语言 都是重要的底层基础知识。
现在,我们来正式的讲一下如何进行二进制漏洞挖掘工作!
我们来看一下上面的代码,发现什么了吗?
存在一个数组,数组大小是32个字节!
我们接下来,去追踪对于这个数组的引用,我们发现这段代码中使用了 read 函数,这个函数在这段代码中的用途,是从输入源(文件描述符 或 输入输出资源)中读取56个字符 到 s 这个数组中!那么,问题出现了!s 这个数组的大小只有32个字节,是容纳不了56个字节的数据输入的!
这意味着,栈溢出漏洞,必然存在!
通过代码审计,通过对于C语言代码的阅读,我们可以更加清晰地了解,一些二进制程序,是否存在安全漏洞!
通过使用 IDA 软件,我们已经知道这个二进制程序,是存在安全漏洞的!
为了更进一步验证这个安全漏洞的威胁性,我们需要进行漏洞利用方面的测试工作。
我们首先通过 checksec 工具来了解,这个BUG程序开启了哪些保护。
不同的保护,需要采用不同的方法去应对!
根据 checksec 工具的
输出结果,我们可以分析出关于 /data/ropgadget/tmp/ret2win/ret2win
这个二进制文件的安全特性。
下面是对每一项特性的解释:
-
RELRO: 结果显示 "Partial RELRO",意味着只有部分RELRO(Relocation Read-Only)被启用。RELRO是一种安全特性,用于防止攻击者修改GOT(Global Offset Table)表项以执行恶意代码。完全RELRO能提供更好的保护,但此文件仅启用了部分RELRO,这意味着可能存在got表泄露攻击的可能性。
注意:partial RELRO(部分重定位只读),.got 全局变量引用位置保存表 的状态被设置为只读!但是,.got.plt 函数引用位置保存表 的状态却是既可读也可写的!这就为我们实施got表泄露攻击提供了可能性(这里有比较关键的一点,载入地址未开启随机化ASLR这个开关,必须是没有被启用)!科普一下,与partial RELRO相对的是 full RELRO(完整重定位只读),在full RELRO状态下,整个GOT表(包含了 .got 全局变量引用位置保存表 和 .got.plt 函数引用位置保存表)都是只读的!并且,在程序刚开始执行时,就直接去解析并绑定关联了动态链接库中的所有符号内容(包括 符号 和 符号对应的代码所在的内存地址)!说到 got表泄露攻击 ,其主要涉及到 .plt(代码节),.got(数据节),.got.plt(数据节) 这3个节!.plt 是 程序链接表 !.got 是 全局变量引用位置保存表 !.got.plt 是 函数引用位置保存表 !而我们可以利用的,正是.got.plt 函数引用位置保存表 ! 当前程序,虽然处于了 partial RELRO(部分重定位只读)状态,但是其 .got.plt 节(函数引用位置保存表),仍然处于可写状态!
-
STACK: 结果中没有明确提及栈的保护状态(如栈是否可执行等),但通常这会与NX(No-eXecute)或类似机制一起讨论。
-
CANARY: 结果显示 "No canary found",意味着没有启用栈保护(Stack Canary)。栈保护是一种防止栈溢出攻击的技术,通过在栈上放置特定的值(称为canary)来检测栈是否被篡改。没有开启 canary ,意味着 覆盖栈上数据 不会触发 canary 栈保护机制!
-
NX: 结果显示 "NX enabled",表示启用了NX位(No-eXecute)。这是一个硬件级别的保护,用于防止数据段(如栈或堆)被执行,有助于防御代码注入攻击。这意味着栈段内容不可执行!
-
PIE: 结果显示 "No PIE",意味着没有启用位置无关执行(Position Independent Executable)。PIE是一种安全特性,使得程序的内存布局在每次运行时都是随机的,从而增加了攻击者预测和利用漏洞的难度。没有启用 PIE ,这意味着 函数代码所在的内存地址 相对固定 ,不会出现 每次重新启动程序,函数代码所在的内存地址都不同的情况!
-
RPATH/RUNPATH: 结果显示 "No RPATH" 和 "No RUNPATH",这两个与动态链接库的搜索路径相关,不直接影响安全性,但在某些情况下可能被利用来执行恶意代码。
-
Symbols: 结果显示 "69 Symbols",表明二进制文件中有69个符号。符号是程序中的函数和变量的名称,它们在调试和逆向工程中很有用。
-
FORTIFY: 结果显示 "No", "0", "3"。这些值通常与Fortify保护相关,Fortify是一种源代码安全分析工具,可以在编译时添加额外的安全检查。这里的结果显示该文件没有使用Fortify进行保护。
总结来说,这个二进制文件启用了部分RELRO和NX保护,但没有启用栈保护(Canary)、PIE、Fortify等安全特性。这使得它在面对某些类型的攻击(如栈溢出、代码注入)时可能较为脆弱。
(未完待续)