シェルコードを格納するために環境変数を使用し、それを自分のRETにポイントして、シェルコードを実行できるようにしています。これが私の脆弱なプログラム「abc.c」です
_#include string.h
#include stdio.h
void foo(const char* str){
char buf[100];
printf("\n%p\n",buf);
strcpy(buf,str);
}
int main(int argc, const char* argv[]){
foo(argv[1]);
}
_
これまでに次の手順を実行してきました
_$gcc -z execstack -fno-stack-protector -o abc abc.c
_
別のプログラム内でgetenv()を使用して、シェルコードのアドレスを特定しました。一部の_0xbfffc209
_としましょう
$./abc $(python -c 'print "AAAA"*30')
を使用すると、プログラムが容赦なくクラッシュしますが、4つのAの代わりにアドレスを使用すると、プログラムは正常に終了します。
ご覧のとおり、何も上書きされていません。 ltraceの出力
$ltrace ./abc $(python -c 'print "\x09\xc2\xff\xbf"*30')
および
$ltrace ./abc $(Perl -e 'print "\x09\xc2\xff\xbf"*30')
は
私はこの種の不可解な振る舞いに完全に困惑しており、誰かがこれがなぜそうなっているのかを理解するのを手伝ってくれるとうれしいです。
前もって感謝します
PS
Ubuntu 14.04 32ビットVMを使用しています
使用するアドレスに関係なく、同じ結果が表示されます
ペイロードのすべての文字がバイナリのargvを介して送信できるわけではありません。シェルコードに含めることができない「不良文字」がいくつかあります。文字列をコピーするためにstrcpyを使用していて、「\ x00」が文字列の区切り文字であるため、例は「\ x00」です。したがって、最初にプラットフォームの悪い文字を特定し、次にそれらのバイトのないペイロードを作成します。
PS:私はこれにコメントすることができましたが、私は49の評判しかありませんでした。