web-dev-qa-db-ja.com

system()のアドレスをリークしようとする単純なバッファオーバーフロー

コード:

#include <string.h>

void vuln(char *arg) {
    char buffer[10];
    strcpy(buffer, arg);
}  

int main( int argc, char** argv ) {
    vuln(argv[1]);
    return 0; 
}

合計26文字のバッファーを入力してEIPを上書きできると判断しました。 gdbのアドレス

system():                      0xb7e41b40
"/bin/bash" portion of $Shell: 0xbffffdac 

私が走れば

run $(python -c "print ('a' * 22) + '\x40\x1b\xe4\xb7'+'FAKE'+'\xac\xfd\xff\xbf'")

gdbではシェルにドロップします。残念ながら、これはASLRが原因でシェルでは機能しません。 GDBは、strcpyが0xb7e7c750にあり、system()から0x3AC10のオフセットがあることを教えてくれます。私が考えていることは、実行時にstrcpyのアドレスを何らかの方法で保存し、オフセット(および文字列へのオフセット)を使用できる場合、本質的に私が実行しているsystem( "/ bin/bash")を実行することができます。 m ASLRなしでgdbで実行。

該当するドキュメントへのヒントや指示があれば、大歓迎です。セキュリティ対策を無効にすることなく、バグを悪用しようとしています。

現在、ASLR、PIE、ASCII Armor、NX(私は想定している)、およびSSP(これも想定されています)です。私はDebian 9を使用しています。ストレッチありがとうございます!

1
Bobby Bushay

RelROについては何も言わないので、RelROは想定していません(そのため、まだ呼び出されていないため、strcpyのアドレスが漏洩することはありません)。しかし、これはそれほど重要ではありません。理由は次のとおりです。

ASIEと組み合わせてPIEが有効になり、メモリ内のバイナリの場所がランダム化され、PLTとGOTの場所がランダム化されます。したがって、場所が不明であるため、PLTまたはGOTからリークすることはできません。

銀の裏地があります。ビットネスについては何も言われませんでした。 ASLR(およびPIE)は、32ビットシステムで総当たりにすることができます。

64ビットシステムを使用している場合、あなたは不運です:プログラムは明らかにバイナリの悪用の基本を教えるように設計されており、それらは(成功して)ASLR、PIE、NXおよびスタックカナリアによって軽減されます。

基本を学びたい場合は、これらの基本的な悪用手法を軽減するセキュリティ機能を無効にする必要があります。

2
Tobi Nary