gpt4 book ai didi

c - 使用旧的 C/C++ 编译器开发的黑客程序?

转载 作者:行者123 更新时间:2023-11-30 21:30:13 26 4
gpt4 key购买 nike

使用的编译器:GCC 3.4.4操作系统:Windows XP 32位

使用较旧的 C/C++ 编译器(例如 gcc 3.4 或 Visual Studio 6),可以通过缓冲区溢出来操纵堆栈帧来操纵程序执行(例如通过损坏的返回地址)。

试图证明这一点失败了,因为我需要复制的所有数据都包含一个零字节,复制总是在该字节处停止。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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");
else
printf("wrong password, %s \r\n", argv[1]);

return 0;
}

如代码所示,我使用命令行参数来填充缓冲区。这总是在第一个空白处停止。我搜索了几个例子(书:《黑客——利用的艺术》、stackoverflow…),但所有例子都使用不包含零字节的地址。这种情况下的问题取决于返回地址前面内存中保存的堆栈指针(地址包括零字节),如果堆栈指针没有某个有效值,则程序总是失败。

我想跳转的地址是 0x004013BA,而不是 0x004013b1。保存的堆栈指针的值为0x0022ff78。这意味着我需要用 43 字节的随机内容以及堆栈指针和返回地址填充缓冲区。

如何解决这个问题?

谢谢

最佳答案

简短的回答:不可能

其背后的原因是 c 字符串是空终止的。如果读取到 0x00,函数 strcpy 将停止复制。该特性还用于一些缓冲区溢出保护功能,例如 ASCII-armor ASLR (RedHat Exec-Shield)。

This link is maybe also helpful.

关于c - 使用旧的 C/C++ 编译器开发的黑客程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27381554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com