web-dev-qa-db-ja.com

64ビットでのバッファオーバーフローメモリアドレスの計算

リモートマシンのバッファオーバーフローの脆弱性を利用する必要がある割り当てがあります。プログラムの実行権限しかないため、gdbを使用できません。私はなんとかしてripを制御でき、自分のアドレスをオーバーフローして書き込むことができました。私のシェルコードは準備ができています(実行可能スタックとASLRが無効になっています)が、返すべき正しいアドレスを見つけることができません。これは64ビットマシンであるため、nopパディングはオプションではありません。主な目的は、実行可能ファイルが実行されるたびに更新されるログファイルにアクセスすることです。 (それは大学の割り当てであり、違法行為を心配する必要はありません)

私に何ができる?バッファのメモリアドレスを計算する方法、または別の方法はありますか?どんな助けでもいただければ幸いです

2
George Sp

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
3
ATetereb