通过xinetd简单缓冲区溢出

时间:2016-08-29 03:56:23

标签: c buffer-overflow

我试图制作一个简单的缓冲区溢出教程,通过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;
}

2 个答案:

答案 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);