使用的编译器:GCC 3.4.4操作系统:Windows XP 32位
使用较旧的 C/C++ 编译器(例如 gcc 3.4 或 Visual Studio 6),可以通过缓冲区溢出来操纵堆栈帧来操纵程序执行(例如通过损坏的返回地址)。
试图证明这一点失败了,因为我需要复制的所有数据都包含一个零字节,复制总是在该字节处停止。
#include
#include
#include
int checkauth(char *password)
{
int authflag = 0;
char passwordbuffer[10] = "aaaaaaa";
strcpy(passwordbuffer, password);
if(strcmp(passwordbuffer, "password")==0)
authflag = 1;
return authflag;
}
int main (int argc, char *argv[])
{
int authflag = 0;
char password[10] = "bbbbb";
if (argc < 2)
{
printf("Password missing");
exit(0);
}
authflag = checkauth(argv[1]);
if(authflag > 0)
printf(" password ok \r\n");
khác
printf("wrong password, %s \r\n", argv[1]);
trả về 0;
}
如代码所示,我使用命令行参数来填充缓冲区。这总是在第一个空白处停止。我搜索了几个例子(书:《黑客——利用的艺术》、stackoverflow…),但所有例子都使用不包含零字节的地址。这种情况下的问题取决于返回地址前面内存中保存的堆栈指针(地址包括零字节),如果堆栈指针没有某个有效值,则程序总是失败。
我想跳转的地址是 0x004013BA,而不是 0x004013b1。保存的堆栈指针的值为0x0022ff78。这意味着我需要用 43 字节的随机内容以及堆栈指针和返回地址填充缓冲区。
Làm thế nào để giải quyết vấn đề này?
Cảm ơn
Tôi là một lập trình viên xuất sắc, rất giỏi!