リモートマシンのバッファオーバーフローの脆弱性を利用する必要がある割り当てがあります。プログラムの実行権限しかないため、gdbを使用できません。私はなんとかしてripを制御でき、自分のアドレスをオーバーフローして書き込むことができました。私のシェルコードは準備ができています(実行可能スタックとASLRが無効になっています)が、返すべき正しいアドレスを見つけることができません。これは64ビットマシンであるため、nopパディングはオプションではありません。主な目的は、実行可能ファイルが実行されるたびに更新されるログファイルにアクセスすることです。 (それは大学の割り当てであり、違法行為を心配する必要はありません)
私に何ができる?バッファのメモリアドレスを計算する方法、または別の方法はありますか?どんな助けでもいただければ幸いです
Gdbに慣れていて、ripを制御できる場合は、ソリューションから一歩離れています。
小さな例を作ってみましょう
void main() {
char* buff = "asdf";
}
コンパイルする
$ gcc test.c
デバッガを使用します
$ gdb a.out
(gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004004d6 <+0>: Push rbp
0x00000000004004d7 <+1>: mov rbp,rsp
0x00000000004004da <+4>: mov QWORD PTR [rbp-0x8],0x400574
0x00000000004004e2 <+12>: nop
0x00000000004004e3 <+13>: pop rbp
0x00000000004004e4 <+14>: ret
End of assembler dump.
したがって、変数buffはスタックのrbp-0x8にあります。 ASLRが無効の場合-アドレスは常に同じです。あなたはそれを得ることができます:
(gdb) break *0x00000000004004e2
Breakpoint 1 at 0x4004e2
(gdb) r
Starting program: ./a.out
Breakpoint 1, 0x00000000004004e2 in main ()
(gdb) p $rbp-0x8
$1 = (void *) 0x7fffffffdbd8