我有一个小的 C 程序可供利用。我也理解了要执行的攻击背后的逻辑。然而,尽管我尝试了很多,但它对我来说不起作用。
#include <stdio.h>
#include <stdlib.h>
#define SECRET1 0x44
#define SECRET2 0x55
int main(int argc, char *argv[]) {
char user_input[100];
int *secret;
int int_input;
int a, b, c, d; /* other variables, not used here.*/
/* The secret value is stored on the heap */
secret = (int *) malloc(2*sizeof(int));
/* getting the secret */
secret[0] = SECRET1; secret[1] = SECRET2;
printf("Please enter a decimal integer\n");
scanf("%d", &int_input); /* getting an input from user */
printf("Please enter a string\n");
scanf("%s", user_input); /* getting a string from user */
printf(user_input);
printf("\n");
/* Verify whether your attack is successful */
printf("The original secrets: 0x%x -- 0x%x\n", SECRET1, SECRET2);
printf("The new secrets: 0x%x -- 0x%x\n", secret[0], secret[1]);
return 0;
}
我只需要使用格式字符串“printf(user_input);”打印secret[0]的地址和值
我尝试给出类似“\x6e\xaf\xff\xff%x%x%x%x%s”的内容。但它不起作用。任何建议将不胜感激。多谢。
这看起来像是课堂练习,所以我将提供一些指导,但没有实际的解决方案。
您正试图通过提供不受信任的输入来利用该程序。这里有两个相当明显的错误;一个是scanf()
using %s
,因为您可以溢出缓冲区并覆盖堆栈。另一个是格式字符串漏洞。在函数返回之前,覆盖堆栈可能不会让您做任何有趣的事情。根据“验证您的攻击是否成功”部分,您可能想在此之前利用该漏洞,因此我猜测它应该是格式字符串漏洞。
根据验证部分,您应该覆盖由secret
。唯一的办法就是造成printf
写入内存中的受控位置是使用%n
格式说明符,写入给定的指针。
现在的技巧是弄清楚如何遍历堆栈直到找到合适的指针。方便的是,堆栈上的指针之前有一个用户控制的整数。因此,我们输入一个易于识别的数字(可能是 65535,即ffff
以十六进制表示),并使用带有很多的格式字符串%x
s 查看堆栈上有什么。一旦我们找到了,堆栈上的下一个东西应该是指针。
唔。我刚刚尝试了一下,结果发现事情并不那么简单。堆栈帧的确切布局实际上与声明的顺序无关;对我来说不同的系统之间有所不同。相反,我不得不使用很多%lx
s,在开头加上一个众所周知的字符串,并添加一行来打印出实际的指针,这样我就知道何时找到它。然后替换对应的%lx
与%n
通过该指针进行写入。尝试 20 左右可能是最简单的%lx
s,并逐一替换为%n
,直到您成功覆盖该指针。
无论如何,希望这足以让您开始。如果您有任何疑问,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)