我试图使用格式字符串攻击覆盖c程序中的变量。 这是安全课的家庭作业,我不是要求你为我做作业。然而,我正在努力让这个工作,我不明白为什么。此外,我了解到有关于此主题的其他问题,但这些帖子都没有能够帮助我。
我正在研究我教授为我设置的虚拟机。易受攻击的代码是由他构建的,因此我不确定他是如何做到的,操作系统是Linux 3.13.0-65-generic i686,ASLR应该被教授禁用。我们没有收到关于设置环境以允许此攻击成功的任何指示,因为环境是由教授完全设置的。此外,我没有在VM上使用sudo权限来自己做这些事情。
这是我的攻击所针对的易受攻击的应用程序的代码:
#include <stdio.h>
#ifndef MAGICNUM
#define MAGICNUM 0x41424344
#endif
int x = 0;
void vuln() {
int y = 1;
char buf[128];
printf("This is vuln() \tx = %08x \ty = %08x\n", x, y);
printf("Enter your input: ");
scanf("%127s", buf);
printf("You entered: ");
printf(buf);
printf("\n\n");
printf("Now x = %08x and y = %08x\n", x, y);
if(x==MAGICNUM) {
printf("Success!\n");
system("/bin/sh");
}
else {
puts("Sorry, try again.");
}
return;
}
int main(int argc, char* argv[])
{
vuln();
return 0;
}
我的目标是再次使用格式字符串攻击覆盖变量x。家庭作业要求我用MAGICNUM覆盖它,但是现在我只是想把任意值分配给x。
使用GDB我能够发现x的地址是0x0804a030
。
我知道我需要使用%n
格式说明符,这些是我到目前为止尝试过的输入字符串的一些示例:
"\x30\xa0\x04\x08%08x.%08x.%08x.%08x%n"
"\x30\xa0\x04\x08%8s%n"
"\x30\xa0\x04\x08%.8%n"
所有这些输入字符串都会触发分段错误,我无法弄清楚它们无法正常工作的原因。
对于我能成功覆盖x所做的任何见解都会很棒。
答案 0 :(得分:0)
我认为你需要溢出他指定的缓冲区大小。查看变量buf[128]
。关于堆栈缓冲区溢出的Google,并尝试确定如果将超过127个字符的参数传递给程序会发生什么。
答案 1 :(得分:-1)
以我的拙见,我认为这是不可能的。
x
位于全局地址空间(.data
)中,所有其他变量位于堆栈空间中。在缓冲区溢出攻击中,您设法覆盖缓冲区中的内存。但是这里的缓冲区和变量可以相隔数英里。您无法对其距离做出任何假设,因此您无法确定覆盖x
会导致多少超支。
此外,没有可能导致超限的指令或过程调用。 scanf
可以很好地屏蔽,最多可以获得127个字符,并且printf
语句可以打印到stdout,因此不会导致溢出。
如果您的教授为您提供覆盖x
的解决方案,我会非常有兴趣听到它。