web-dev-qa-db-ja.com

バッファオーバーフローの問題

64ビットバイナリでのバッファオーバーフローの悪用について簡単な質問があります。最近、いくつかの基本的なバッファオーバーフローの脆弱性を発見しました。私はそれを管理する方法を知っていることを望みましたが、どうやら私は知りません。

タスクコード:

void vulnFunc(int x){
  char buf[12];
  gets(buf);
  if(x!=10) system("/bin/cat flag.txt");
  else printf("Nope!");
}



int main(){
 vulnFunc(10);
 return 0;
}

このシナリオでは、バッファーは引数の後に割り当てられるため、バッファーをオーバーライドしても、「x」値を変更することはできません。 gdbの下をチェックし、バッファに「A」の束を置いた後、スタックは次のようになります-> 0x0000000A 0x41414141 0x41414141...。

1
Zumber

質問に実際に質問を書き込んだわけではありませんが、x86であると仮定すると、xを呼び出す前に、vulnFuncmustの引数をスタックに配置する必要があります。 x86-64では、xがレジスターに渡されるため、これが脆弱にならない可能性があります。したがって、コンパイルの副作用によってスタックに配置されない限り、スタックのどこにも存在しない可能性があります。

1
David

スタックのリターンアドレスを上書きして、「system( "/ bin/catflag.txt")」に戻ります。

0
rhodeo