web-dev-qa-db-ja.com

EIPのアドレスが正しいにもかかわらず、シェルコードが実行されない

大学のクラスのバッファオーバーフローに関するプレゼンテーションを作成する必要があります。 EIPに特定の関数のアドレスを挿入し、関数が期待どおりに実行される単純なバッファーオーバーフローを作成することができました。

次に、実行されるシェルコードを挿入するより興味深い例を示します。それはそれが機能しなくなったときです。さまざまなWebサイトで人々が説明する方法をエミュレートしましたが、機能しません。

使用するシェルコードに関係なく( Shellcode )、問題は、注入したコードが実行されないことです。したがって、プログラムは正しいアドレスにジャンプし、そのアドレスにあるものは何も実行せずに停止します。

EIP contains 0xbffff2e0 as expected, but the program just stalls and doesn't do anything.

したがって、図の中央のセクションにあるように、「コード」という名前のプログラムは、アドレス0xbffff2e0で私のnopスレッドにアクセスします(シェルコードは4バイトから始まります)以下)、何も起こりません。

次に、エラー出力は、0xbffff2e0にアクセスしようとしたが何も見つからなかったことを示しています(画像の下部を参照してください: "?.

何が起こっているのか考えていますか?

何が欠けていますか?

Edit:質問どおり、この演習で使用したコードを追加します

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

void secret(){
        printf("This is a secret message : you are Awesome!\n");
}

void denied(){
        printf("You don't have the permission to see the secret.\n");
}

int main(int argc, char *argv[]){
        char buf[20];

        strcpy(buf, argv[1]);
        printf("%s\n",buf);

        if(strcmp(buf, "myPassword") == 0){
                secret();
        }
        else{
                denied();
        }

        return 0;
}
1
Loïc N.

スタックはおそらく非実行可能です。脆弱なプログラムを次のようにコンパイルして、保護を無効にします。

gcc -z execstack -o program program.c
2
rhodeo

ここで既に与えられている答えは別として、悪い文字をチェックしたいかもしれません。シェルコードには、発生している問題につながる可能性のあるものが含まれている場合があります。また、EIPの上書きが意図したとおりに機能せず、挿入しようとしているアドレスの1つ(または複数)のバイトが不正な文字である場合もあります。まず、00、0d、および0aは、ほとんどの場合、不適切な文字です。

1
Link