2017-09-27 9 views
2

私は安全なコンピュータシステムコースを受講しています。ターゲットプログラム(target.cc)でバッファーをオーバーフローさせてシェルを取得する必要がある割り当てに問題があります。私はtarget.ccを変更することはできませんが、ターゲットファイルにパラメータを送ることができます。スタックガードをバイパスする - バッファオーバーフロー

ここにコードがあります。

#include <cstdio> 
#include <cstring> 
#include <cstdlib> 
class SubStringReference 
{ 
    const char *start; 
    size_t len; 

public: 
    SubStringReference(const char *s, size_t l) : start(s), len(l) { } 
    virtual ~SubStringReference() { } 
    virtual const char *getStart() const { return start; } 
    virtual int getLen() const { return len; } 
}; 

void print_sub_string(const SubStringReference& str) 
{ 
    char buf[252]; 
    if (str.getLen() >= sizeof buf) 
    { 
     // Only copy sizeof(buf) - 1 bytes plus a null 
     memcpy(buf, str.getStart(), sizeof(buf) - 1); 
     buf[sizeof(buf) - 1] = '\0'; // null-terminate 
    } 
    else 
    { 
     printf("by passed mem check\n"); 
     // The length is less than the size of buf so just string copy. 
     strcpy(buf, str.getStart()); 
     buf[str.getLen()] = '\0'; // null-terminate to get just the substring 
    } 
    puts(buf); 
} 

int main(int argc, char **argv) 
{ 
    if (argc != 4) 
    { 
     fprintf(stderr, "Usage: %s STRING START LENGTH\n", argv[0]); 
     return 1; 
    } 
    const char *s = argv[1]; 
    int total_len = strlen(s); 
    int start = atoi(argv[2]); 
    int len = atoi(argv[3]); 
    if (start < 0 || start >= total_len) 
    { 
     fputs("start is out of range!\n", stderr); 
     return 1; 
    } 
    if (len < 0 || start + len > total_len) 
    { 
     fputs("length is out of range!\n", stderr); 
     return 1; 
    } 
    SubStringReference str(s + start, len); 
    print_sub_string(str); 
    return 0; 
} 

このプログラムはスタックガードで保護されているため、プログラムは復帰する前に中止されます。私はバッファをオーバーフローさせてシェルを得ることができる他の方法はありますか?

ありがとうございました。

編集 - 私はグラムとQEMUアームエミュレータでこれを実行しています++コンパイラ

+2

スタックガードを削除してスタックからコードを実行できるようにするには、多少の設定が必要なことがあります。これは、使用するOSとコンパイラによって異なります。しかし、あなたはそれらの詳細を私たちに教えるのを忘れました。 –

+1

すみません。私は質問を編集しました。私は割り当ての要件であるので、スタックガードを無効にすることはできません。私はスタックガードをバイパスする必要があります –

+0

あなたのシステムにはどのくらいの大きさの 'int'がありますか? – ead

答えて

0

脆弱性は、バッファをオーバーフローとシェルコードを指すようにstr.getLen()関数のアドレスを上書きすることによって悪用される可能性があります。カナリーチェックは関数の最後に行われるので、カナリアがチェックされる前にシェルが取得されます。

+0

サンプル入力を共有してください。 – ead

関連する問題