スタックベースのバッファオーバーフローがあるプログラムがあります。 ASLRとDEPを使用してPIEを実行していますが、固定された場所にある実行可能コードのセクションがあります。
ただし、この領域にはint 0x80は含まれていません。ガジェットを取得します。 eax、ebx、ecx、edxを制御できます。たとえば、mprotectを呼び出してシェルコードを読み取るために、任意のsyscallを実行するにはどうすればよいですか?すべてのシステムコールはint 0x80を必要とするようで、これを回避する方法がわかりません。
関連するコードにはint 0x80ガジェットがありますが、その後にjmp命令が続きます。
したがって、私は0x80なしでsyscallを作成する方法、または一度に2つのsyscallを作成する方法(メモリ保護を設定し、読み取り、シェルコードを実行する)を探しています
int 0x80は、システムコールを作成するための非常に古い方法です。それがもうサポートされているかどうかはわかりません。イメージ内のsyscall/systenter命令を探したい場合があります。もちろん、これは使用しているハードウェアとOSに依存します。 1995年以降のハードウェア/ハードウェアVMエミュレーターとソフトウェアを使用している場合は、おそらくsyscall/sysenter命令を探しているはずです。
Syscall/Sysenterを使用して(実行可能ファイルが32ビットか64ビットかによって、どちらか一方を使用して)システムコールを作成します。 syscallとint 0x80を使用するためのレジスタ構成は同じでなければなりません。 syscall/sysenterを簡単に見つけられるはずです。ほとんどのアプリケーションでは、vdso.soがそのアドレス空間にマッピングされているはずです。この知識を使用して、syscall retガジェットを見つけることができます。参照
http://man7.org/linux/man-pages/man7/vdso.7.html
同じコアで同時に2つのシステムコールを行うことはできません。