如果存在金丝雀但无法找出其价值,如何利用 BOF 漏洞

问题描述 投票:0回答:2

这是利用 BOF 进行的简单 CTF 挑战。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
    char overflowme[32];
    printf("overflow me : ");
    gets(overflowme);   // smash me!
    if(key == 0xcafebabe){
        system("/bin/sh");
    }
    else{
        printf("Nah..\n");
    }
}
int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;
}

显然 gets 在这里很脆弱。但目标二进制文件是用金丝雀代码编译的,因此我们不能只是溢出缓冲区。我们必须事先了解金丝雀。怎么可能没有格式字符串泄漏?我在这里看到的唯一方法是愚蠢的蛮力。

c++ buffer-overflow ctf
2个回答
0
投票

您可以尝试使用“面向返回编程”(ROP)来绕过金丝雀保护并利用缓冲区溢出漏洞。 ROP 允许您通过将程序代码或库中已存在的称为“小工具”的小代码片段链接在一起来执行任意代码。

您必须找到一个小工具,允许您在“func”函数的“key”参数中输入值。然后,您可以使用此小工具将值 0xcafebabe 插入到“key”参数中,从而绕过金丝雀检查并调用 system("/bin/sh")。

您可以使用“ROPgadget”或“Ropper”等工具来查找小工具。这些工具使您能够在二进制文件或库中查找小工具,并创建可用于利用漏洞的 ROP 链。

编辑:如果您不熟悉汇编语言,则可能很难使用 ROP 进行利用。


0
投票

没有 BOF 就无法运行 ROP 攻击,不是吗?

© www.soinside.com 2019 - 2024. All rights reserved.