关于AWD的几种玩法

发布时间 2023-06-21 16:42:38作者: Sta8r9

关于AWD的几种玩法。

什么是AWD

​ CTF竞赛分为解题模式和AWD(攻防演练)模式。

​ AWD是"Attack With Defense"的缩写,它指的是一种网络安全竞赛形式,也称为攻防赛。AWD比赛旨在模拟真实网络环境中的攻击与防御情境,参赛者将被分为攻击方和防守方,相互进行攻击和防守的对抗。

在AWD比赛中,攻击方的任务是发起各种网络攻击,如漏洞利用、拒绝服务攻击、入侵等,以获取对手系统中的敏感信息、控制权或破坏系统功能。而防守方的任务是保护自己的系统,及时发现和阻止攻击行为,修复漏洞,并确保系统的安全性和可用性。

AWD比赛强调攻守兼备的能力,参赛者既需要具备攻击者的思维和技术,能够发现系统中的弱点并利用它们,也需要具备防守者的技能,能够分析攻击行为、快速做出反应并保护系统免受攻击。

通过参与AWD比赛,安全从业者可以提高自己的技术水平、增强实战能力,并深入理解攻击与防御的原理和技术。同时,AWD比赛也促进了安全社区之间的交流与合作,推动网络安全技术的发展。

简单地说:

​ 对于pwn,在比赛时每支队伍会维护一台服务器,服务器上运行着一些存在漏洞的程序,不同队伍的服务器状况是相同的,选手可以从服务器上下载程序附件,分析漏洞,再针对此漏洞对其他队伍的服务器进行攻击从而得分,同时也要尽快修补好自己服务器上的这个漏洞防御其他队伍的攻击。(发现漏洞后一般优先攻击,因为攻击得分要高于防守得分)

漏洞利用与漏洞修补

漏洞利用

​ 服务器上的题目附件和平常打的解题模式相似,漏洞利用攻击服务器的思路和手法也就是平常做题的思路和手法,这里不再赘述。

漏洞修补

漏洞修补就比如说有一道题存在栈溢出漏洞,缓冲区有0x10字节却允许输入0x20字节,漏洞修补就是去把0x20改为0x10字节让其无法溢出。值得注意的是,比赛时我们拿到的题目附件是编译好的二进制文件,也就是说我们只能在IDA中对汇编代码进行修补而不是说能拿到源码去对c语言代码进行修补。这就需要一个功能强大的IDA插件了。Keypatch是一个利用keystone框架修改二进制可执行文件的插件。由于IDA自带的patch功能只能使用机器码进行修改,且修改后不能撤销,Keypatch就应运而生了。安装该插件的步骤放在文章末尾

常见的修补漏洞:

索引越界漏洞、溢出漏洞、格式化字符串漏洞、整数溢出漏洞、UAF漏洞。之后会逐一进行举例介绍。

索引越界漏洞

以一个数组索引越界举例。

img

可以看到数组a为全局变量处在bss段的位置img

并且在输入索引后,程序并未对索引进行检查,针对这类漏洞的利用方法之一是让索引为负值去篡改got表。

img

在安装了Keypatch插件后可以很方便的进行漏洞修补。首先定位到输入索引的汇编位置,可以看到索引在距离栈底偏移为8的位置,修补思路就是对它做一个if判断,如果超出范围就把它的值改成一个范围内的值。

img

keypatch的快捷键是ctrl Alt+k,当然右键单击也可看到。img

​ 现在到底应该怎么改呢,想要加入一个if判断需要很多字节的汇编代码这是毋庸置疑的,如果把这些汇编直接放0x400651显然是不可行的,因为它们会覆盖大量0x400651以下的汇编代码。这时我们可以在这里写一个跳转指令,把if判断放在一个不重要的位置再跳转到那里执行,最后再跳转回来。那么这个“不重要的位置”是哪里呢,它至少应该有执行权限。

​ eh_frame_hdr和eh_frame就符合我们的要求,它是用于支持异常处理(Exception Handling)的信息。eh_frame_hdr 节包含了一组表项,每个表项描述了 .eh_frame 节中的一组异常处理信息的范围。它提供了一种紧凑的数据结构,使得异常处理运行时库(如 C++ 标准库中的异常处理机制)能够快速定位并遍历 .eh_frame 节中的异常处理信息。

​ 由低版本ubuntu编译出来的二进制文件的eh_frame部分是具有执行权限的,并且比赛时的题目附件的eh_frame一般都具有执行权限,而且eh_frame一般在程序链接时被用到,在程序运行时是不重要的。所以,我们要做的就是把if判断放在eh_frame并跳转执行再跳转回去。

​ 本例中eh_frame_hdr的起始地址为0x4007e4,现在在0x400651处改第一条汇编(jmp 0x4007e4)。img
接着到0x4007e4布置if判断的汇编。

cmp dword ptr[rbp-8],0

将索引和0作比较。

img

jl 0x400810

当索引小于0时跳转到0x400810(0x400810处放的是将索引设置为0的汇编,因为检查出索引越界后还需要将索引设置一个正常值让程序继续运行,这里的0x400810是另一个“不重要的位置”。当然,你可以不使用这个地址另找一个地址,只要这个地方不会干扰程序正常运行并且具有可执行权限。)

img

cmp dword ptr[rbp-8],7

将索引和合法索引的最大值(本例为7)作比较。

img
jg 0x400860

当索引大于7时跳转到0x400860

img

如果以上两种情况程序均未跳转,则说明索引未越界,这时就需要跳转回text段让程序正常执行下去。值得注意的是,刚开始在text添加的跳转指令覆盖了程序原来正常的汇编指令,在跳转回去之前需要将他们补到eh_frame.

mov eax,[rbp-8]

这是在text段被覆盖的第一条指令。

img

movsxd rdx,eax

这是在text段被覆盖的第二条指令

img

jmp 0x400657

跳转回text段继续执行程序(注意汇编指令的衔接)

img

接下来别忘了补上在0x400810和0x400860放重新设置索引的汇编代码。

mov dword ptr[rbp-8],0

将索引设置为最小值0

img

然后同样需要补上text被覆盖的汇编代码再跳转回text,操作和上面一样就不再一步一步截图啦。

img

接着去0x400860设置汇编

mov dword ptr[rbp-8],7

img

将索引设置为最大值7

同样需要补上text段被覆盖的汇编再跳转回text。

img

到这里漏洞修补的技术活儿就结束了,最后别忘记还需要去设置里应用这些更改之后才能退出。否则之前所有努力白费。

点击edit的patch program中的“Apply patches to input file...”然后点ok再退出就行了。

img
将修改后的附件放在ubuntu进行验证。

img

可以看到当输入越界索引后程序实际上还是在合法索引中写入了我们输入的内容,并且打印的地址也都没有超出范围。

在IDA中动态调试可以就看到程序确实是进行了跳转,并且汇编也和我们所更改的一样。

img

这说明漏洞修补成功。

其他几种漏洞将在下一篇文章进行介绍。

IDA插件keypatch的安装

我的IDA版本为7.7,如果通过以下步骤安装失败,可能与IDA版本有关

1、将keypatch.py文件放入ida的plugins目录下

(keypatch.py可以从网上找到,在开源社区GITHUB,如果你实在下载不了可以直接访问https://pan.baidu.com/s/19Trr2CAbi4PO67AGTJBZAw?pwd=1234 提取码:1234 )

img

2、在主机的命令行窗口执行如下两条命令。(需要主机先安装python环境)

pip install keystone-engine
pip install six

3、重启IDA并进入edit查看插件是否安装成功

img

index例题附件:

链接:https://pan.baidu.com/s/1JWtgObibcvadYWYvWpkf6Q?pwd=1234
提取码:1234