NOPスレッドでASLRをバイパスしようとしています。vuln() のアセンブリは次のとおりです。申し訳ありませんが、ソース コードはありません。
0804878a <vuln>:
804878a: 55 push %ebp
804878b: 89 e5 mov %esp,%ebp
804878d: 53 push %ebx
804878e: 81 ec a4 00 00 00 sub $0xa4,%esp
8048794: e8 77 fe ff ff call 8048610 <__x86.get_pc_thunk.bx>
8048799: 81 c3 67 18 00 00 add $0x1867,%ebx
804879f: 83 ec 0c sub $0xc,%esp
80487a2: 8d 85 64 ff ff ff lea -0x9c(%ebp),%eax
80487a8: 50 push %eax
80487a9: e8 52 fd ff ff call 8048500 <gets@plt>
80487ae: 83 c4 10 add $0x10,%esp
80487b1: 83 ec 0c sub $0xc,%esp
80487b4: 8d 85 64 ff ff ff lea -0x9c(%ebp),%eax
80487ba: 50 push %eax
80487bb: e8 80 fd ff ff call 8048540 <puts@plt>
80487c0: 83 c4 10 add $0x10,%esp
80487c3: 8b 83 fc ff ff ff mov -0x4(%ebx),%eax
80487c9: 8b 00 mov (%eax),%eax
80487cb: 83 ec 0c sub $0xc,%esp
80487ce: 50 push %eax
80487cf: e8 1c fd ff ff call 80484f0 <fflush@plt>
80487d4: 83 c4 10 add $0x10,%esp
80487d7: 90 nop
80487d8: 8b 5d fc mov -0x4(%ebp),%ebx
80487db: c9 leave
80487dc: c3 ret
バイナリは 32 ビットで、スタックは実行可能であるため、NOP スレッドを使用することにしました。私のペイロードは次のとおりです。
'A'*160 + return address + '\x90'*1024 + shellcode
私の理解が正しければ、エクスプロイトを何度も実行すると、リターン アドレスが NOP スレッドのどこかを指している可能性があり、プロセッサがシェルコードを実行する可能性があります。
ただし、返信先住所を概算する方法がわかりません。バイナリで gdb を試してみると、元の戻りアドレスが 0xfc3fc758 であることがわかるので、その値を使用します。ペイロードをバイナリにフィードすると、SIGSEGV で終了します。
[*] Process './vuln5' stopped with exit code -11 (SIGSEGV) (pid 9240)
いくつかのデバッグの後、vuln() が戻ったときに segfault がスローされることがわかったので、何が起こるかを確認するためだけにジャンク バイトをフィードしてみました。パディングが 152 バイトを超えるとセグメンテーション違反が発生することが判明しましたが、その理由はわかりません。アセンブリはバッファーが ebp-0x9c で始まることを示しているため、160 バイトは正しいに違いないと思います。
では、NOP スレッドを正しく使用していますか? また、返信先住所を概算するにはどうすればよいですか?