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...。
質問に実際に質問を書き込んだわけではありませんが、x86であると仮定すると、x
を呼び出す前に、vulnFunc
mustの引数をスタックに配置する必要があります。 x86-64では、x
がレジスターに渡されるため、これが脆弱にならない可能性があります。したがって、コンパイルの副作用によってスタックに配置されない限り、スタックのどこにも存在しない可能性があります。
スタックのリターンアドレスを上書きして、「system( "/ bin/catflag.txt")」に戻ります。