本文共 1698 字,大约阅读时间需要 5 分钟。
这是一款网络游戏,包含了多个难度等级的关卡,每个关卡都需要通过不同的安全漏洞来解锁。从level 0到level 8,每个关卡都有独特的挑战和解法。
这一期的wargame难度显著高于之前的leviathan,涉及到较为复杂的Linux溢出知识。然而,初始测试显示难度仅为2/10,说明我需要更加深入地分析和研究。
在narnia的首页,有提示说明使用初始账号和密码登录到目标机器,并指出所有文件位于**/narnia**文件夹下。让我们开始吧!
目标机器的文件夹中,每个level都提供了源代码和已编译的可执行文件。每个可执行文件都具有set-uid权限。只要通过溢出这个可执行文件,获取下一个level的shell,就能从**/etc/narnia_pass/**文件夹中获取下一个level的密码。
首先,我尝试正常执行narnia0文件,发现其行为符合缓冲区溢出的预期。源代码显示,输入缓冲区buf和变量val都位于main函数的栈帧中。通过构造特定的输入,可以成功修改val的值。
然而,直接使用构造的输入未能成功,因为程序输出后自动关闭,导致无法获取shell。后来,我发现需要将shellcode注入到环境变量中,以确保程序执行完成后能够正确获取shell。
执行可执行程序后,我获得了一个有用的提示:只要将shellcode放入环境变量EGG中,就可以成功通过验证。
源代码显示,程序尝试获取环境变量EGG,如果存在则执行其指针指向的函数。因此,我需要构造一个带有shellcode的环境变量。通过gdb获取环境变量地址,并将其注入到EGG中,程序将执行所需的操作。
下一个关卡的可执行程序提示需要通过输入来进行溢出。源代码显示,程序会将输入拷贝到缓冲区中,然后拷贝到栈中的返回地址位置。
通过分析,我发现可以通过构造一个特定的输入字符串,覆盖main函数的返回地址,从而控制程序流程。这种方法利用了缓冲区溢出的基础知识。
这一关的程序涉及文件操作,将输入文件的内容输出到**/dev/null中。源代码显示,程序使用open**函数处理输入文件,并将内容复制到输出文件中。
通过溢出缓冲区的内容,我可以修改输出文件路径,将其重定向到一个软链接文件中。这样,输出将被保存到指定的文件,而不是直接丢弃。
这一关的程序执行后没有输出,提示需要通过分析源代码来寻找溢出点。源代码显示,程序清空了所有的环境变量,无法通过环境变量注入shellcode。
然而,程序允许用户指定输入参数,并将其复制到缓冲区中。通过缓冲区溢出,我可以覆盖栈中的函数指针,从而获取控制。
这一关的程序使用snprintf函数安全地处理输入,但由于格式化字符串漏洞,我可以构造特定的格式字符串来控制输出。
通过分析,我发现可以利用格式化字符串漏洞,修改函数返回地址,从而控制程序执行流程。
这一关需要两个输入参数,且程序使用了多个函数指针和环境变量清空。源代码显示,程序清空了所有环境变量和多余的参数。
通过构造特定的输入字符串,我可以覆盖函数指针的值,并注入shellcode,从而获取控制。
这一关的程序输出提供了函数地址信息,提示存在缓冲区溢出漏洞。源代码显示,程序使用printf和snprintf函数处理输入,但由于栈偏移问题,直接利用gdb获取的地址并不适用。
通过构造特定的格式化字符串,我可以修改函数的返回地址,并利用system函数执行**/bin/sh**。
这一关的程序看似简单,但实际上存在栈溢出问题。源代码显示,程序将输入字符串复制到缓冲区,并覆盖基地址值。
通过分析,我发现可以通过构造特定的输入字符串,覆盖基地址值,并利用栈中的函数指针来控制程序流程。
这次wargame的难度虽然只有2/10,但通过深入分析和构造特定的输入,我成功解锁了所有关卡。虽然过程充满挑战,但也让我对缓冲区溢出漏洞有了更深入的理解。期待下一次挑战!
转载地址:http://umdfk.baihongyu.com/