gcc - 尝试缓冲区溢出时堆栈上出现意外值
问题描述
我正在尝试更多地了解网络安全,在这种情况下是关于缓冲区溢出的。我有一个简单的代码,我想更改以下流程:
#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"'
,它确实有效,并且我需要跳转到的地址也不正确(我也修复了)
解决方案
推荐阅读
- reactjs - 当我在路由器文件夹中添加快递时反应错误
- javascript - 使用 JavaScript 将 x em 添加到字体大小?
- azure-web-app-service - 登录页面包括“使用现有帐户登录”标题,然后为 Azure B2C 删除
- javascript - 可以从react js重复调用api吗
- android - 无法序列化 DslActivationStatus 状态...Android Studio
- python-3.x - 按季度平均分组并获取在平均计算中使用的值 -pandas
- git - 仅将具有历史记录的 TFS 存储库的一部分迁移到 Git azure devops
- javascript - 如何在 HTML5 中打开文件夹
- python - 你能解释一下 keras 模型中 tensorflow 加载和 hdf5 加载之间的区别吗
- postgresql - 在 Postgres 中将复合数组 UNNEST 成行和列