web-dev-qa-db-ja.com

シェルコードパラメータの受け渡し

シェルコードを格納するために環境変数を使用し、それを自分の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の代わりにアドレスを使用すると、プログラムは正常に終了します。

Aの使用 enter image description here

現在Intel形式のアドレスを使用しています enter image description here

ご覧のとおり、何も上書きされていません。 ltraceの出力

$ltrace ./abc $(python -c 'print "\x09\xc2\xff\xbf"*30')および

$ltrace ./abc $(Perl -e 'print "\x09\xc2\xff\xbf"*30')enter image description here

私はこの種の不可解な振る舞いに完全に困惑しており、誰かがこれがなぜそうなっているのかを理解するのを手伝ってくれるとうれしいです。

前もって感謝します

PS

  1. Ubuntu 14.04 32ビットVMを使用しています

  2. 使用するアドレスに関係なく、同じ結果が表示されます

1
user148898

ペイロードのすべての文字がバイナリのargvを介して送信できるわけではありません。シェルコードに含めることができない「不良文字」がいくつかあります。文字列をコピーするためにstrcpyを使用していて、「\ x00」が文字列の区切り文字であるため、例は「\ x00」です。したがって、最初にプラットフォームの悪い文字を特定し、次にそれらのバイトのないペイロードを作成します。

PS:私はこれにコメントすることができましたが、私は49の評判しかありませんでした。

3
sudhackar