Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 尝试缓冲区溢出时堆栈上出现意外值_Gcc_Stack Overflow - Fatal编程技术网

Gcc 尝试缓冲区溢出时堆栈上出现意外值

Gcc 尝试缓冲区溢出时堆栈上出现意外值,gcc,stack-overflow,Gcc,Stack Overflow,我试图了解更多关于网络安全的信息,在本例中是关于缓冲区溢出的。我有一个简单的代码,我想改变流程: #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) {

我试图了解更多关于网络安全的信息,在本例中是关于缓冲区溢出的。我有一个简单的代码,我想改变流程:

#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();
  }
}
#包括
#包括
#包括
#包括
void win()
{
printf(“代码流已成功更改\n”);
}
int main(int argc,字符**argv)
{
易失性int(*fp)();
字符缓冲区[64];
fp=0;
获取(缓冲区);
if(fp){
printf(“调用函数指针,跳到0x%08x\n”,fp);
fp();
}
}
通过使用一些工具,我确定函数指针(fp)在72个字符进入缓冲区后更新它的值。函数
win()
位于值
0xe5894855
处,因此在72个字符之后,我需要将该值提供给缓冲区,以便它跳转到所需的函数

然而,我面临着这个问题:

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

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


Edit:仍然没有弄明白为什么通过python传递十六进制不起作用,但是我发现了一种不同的方法,使用Perl:
Perl-e'print“a”x4x18。“\x55\x48\x89\xe5”
,它确实有效,而且我需要跳转到的地址也不正确(我也修复了该错误)

顺便说一句,gdb的x命令显示您作为参数提供的内存地址或寄存器的内容,因此
x win
显示的是win代码的前几个字节,而不是其地址。0xe58948是
mov%rsp,%rbp
@Mark correct,我能够找出正确的地址并执行代码,但是我仍然无法通过Python输入十六进制字符(尽管所有教程都使用Python来处理此类内容)。顺便说一句,gdb的x命令显示作为参数提供的内存地址或寄存器的内容,因此,
xwin
显示的是win代码的前几个字节,而不是它的地址。0xe58948是
mov%rsp,%rbp
@Mark correct,我能够找出正确的地址并执行代码,但我仍然无法通过Python输入十六进制字符(尽管所有教程都使用Python来实现这类功能)