格式化字符串攻击

2023-11-26

我有一个小的 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以十六进制表示),并使用带有很多的格式字符串%xs 查看堆栈上有什么。一旦我们找到了,堆栈上的下一个东西应该是指针。

唔。我刚刚尝试了一下,结果发现事情并不那么简单。堆栈帧的确切布局实际上与声明的顺序无关;对我来说不同的系统之间有所不同。相反,我不得不使用很多%lxs,在开头加上一个众所周知的字符串,并添加一行来打印出实际的指针,这样我就知道何时找到它。然后替换对应的%lx%n通过该指针进行写入。尝试 20 左右可能是最简单的%lxs,并逐一替换为%n,直到您成功覆盖该指针。

无论如何,希望这足以让您开始。如果您有任何疑问,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

格式化字符串攻击 的相关文章

随机推荐