質問は、実際には C のスタック オーバーフローに関するものです。私は一生やり遂げることができない割り当てを持っています。gdb のすべてを見てきましたが、それを理解することはできません。
質問は次のとおりです。
int i,n;
void confused()
{
printf("who called me");
exit(0);
}
void shell_call(char *c)
{
printf(" ***Now calling \"%s\" shell command *** \n",c);
system(c);
exit(0);
}
void victim_func()
{
int a[4];
printf("[8]:%x\n", &a[8]);
printf("Enter n: "); scanf("%d",&n);
printf("Enter %d HEX Values \n",n);
for(i=0;i<n;i++) scanf("%x",&a[i]);
printf("Done reading junk numbers\n");
}
int main()
{
printf("ls=736c --- ps = 7370 --- cal = 6c6163\n");
printf("location of confused %x \n", confused);
printf("location of shell_call %x \n", shell_call);
victim_func();
printf("Done, thank you\n");
}
わかりましたので、最初の質問を正しく取得することができました。これは、メイン パスで明示的に呼び出されていない 2 つの関数のいずれかを任意に呼び出すことです。ちなみに、これはプログラムを変更せずに実行中に行う必要があります。N
に設定してプログラムを実行することでこれを行いました。これにより7
、フレームの関数ポインターが表示され、混乱したまたはのメモリアドレスでvictim_func
書き込み、動作します。(私は 64 ビット マシンを使用しています。そのため、EBI ポインターの幅が 1 ではなく 2 int であるため、7 にする必要があります)a[7]
shell_call
私の質問は次のとおりです。関数に渡される引数をどのように制御できshell_code
ますか? すなわち。string
に を書くにはどうすればよいですかchar* c
。全体のポイントは、プログラムのみを実行して、psなどの unix コマンドを実行することです。
EBI ポインタをpsの 16 進表現で記述し、引数リストをshell_call
それに設定することを考えましたが、うまくいきませんでした。argsv
また、引数を入力して、の引数リストをメインに設定しようとshell_call
しましたarg_list
が、どちらも機能しませんでした。
2番目のバージョンは機能するはずですが、新しいスタックフレームの引数リストを正しく設定していないと思います(関数ポインターの最初の部分であるため、 に書き込み、 and を書き込むことでそれをa[8]
行いましたが、おそらくこれらは のパラメータであるため正しくありません。では、 のパラメータにアクセスするにはどうすればよいですか?0
a[9]=736c
a[10]=0000
victim_func
shell_call