Stack Buffer Overflow


スタックオーバーフローは、入力バッファの長さをチェックしません.
連続メモリ機能は、他の値の改ざんのリスクが発生する可能性があることを意味します.
特にバッファにコマンドを入力し、Return Addressを入力します.
これをバッファに変換し、バッファに入力するコマンドを実行できます.
オーバーフロー・ホールは非常に脅威的である可能性があります.

SFP & Ret Addr


スタックフレームポインタ(SFP)は、関数が閉じた後に返されます.
スタックアドレスが含まれます.
戻りアドレス(return address)は、関数の終了後に戻ります.
コマンドを含むアドレス.
#include <stdio.h>

int main()
{
  char buf[0x30];
  
  scanf("%s", buf);
  
  return 0;
}
次のコードが存在する場合、main()のスタック構造は次のようになります.

上記のコードではbuf入力を受信した場合、検証は行われません.
攻撃者はbufを超える長さを入力することでreturn addressを操作することができる.
攻撃者がreturn addressの値を改ざんすると、
攻撃者は勝手に変えることができる.

Overflow demonstration



まず、オーバーフロー・ホールが発生する可能性のあるコードを
作成されました.

実験を容易にするために、メモリ保護テクノロジー(Canary、PIE)が適用されていません.

checkseckコマンドでコンパイルしたELFファイルをチェックすると、CannyとPIEが適用されます.
そうでないことを確認できます.
Welcome admin()のアドレスを使用できるようになりました
確認が必要です.現在のELFファイルにPIEがないため、アドレスは固定値です.

gdbを使用してwelcome adminのアドレスをチェックすると、
表示できます.
したがって、
Shellコードは次のとおりです.

gccによりx 86−64にコンパイルされ、SFPのサイズは8バイトである.
x 86環境の場合、SFPのサイズは4バイトである.
作成したShellコードを実行すると、次のようになります.

以下に示すように、プログラムが呼び出されていないwelcome admin()を呼び出すことができます.