00000000004005e0 <printf@plt>:
4005e0: ff 25 3a 0a 20 00 jmp QWORD PTR [rip+0x200a3a] # 601020 <printf@GLIBC_2.2.5>
4005e6: 68 01 00 00 00 push 0x1 # rip+0x200a3a(601020) : 4005e6
4005eb: e9 d0 ff ff ff jmp 4005c0 <.plt>
////
0000000000400782 <main>:
4007bb: b8 00 00 00 00 mov eax,0x0
4007c0: e8 1b fe ff ff call 4005e0 <printf@plt>
4007c5: 48 8d 45 e0 lea rax,[rbp-0x20]
4007c9: 48 89 c7 mov rdi,rax
最初のprintf
関数呼び出し(0x4007c0
)の前までは、rip+0x200a3a(601020)
には4005e6(push 0x1)
が格納。
printf
を呼び出すと4005e6
以降の処理(push 0x1; jmp 4005c0 <.plt>;
)が実行されて、rip+0x200a3a(601020)
にlibc内のprintf
関数のアドレスが格納される。
そして、4005e0
を呼び出すとlibc中のprintf
関数に 直接jmp
する。
つまり、gotのアドレスを呼び出すには、一度pltを呼び出す必要がある.([2])
printf
関数を呼び出したあとで、601020
の中身を出力すれば、libc内のprintf
関数のアドレスが得られる
gdb-peda$ b *0x4007c0
Breakpoint 1 at 0x4007c0
gdb-peda$ r
gdb-peda$ x/1xg 0x601020
0x601020: 0x00000000004005e6
gdb-peda$ x/1xg 0x601020
0x601020: 0x00007ffff7a48e80
1回目
00000000004005e0 <printf@plt>:
4005e0: ff 25 3a 0a 20 00 -- jmp QWORD PTR [rip+0x200a3a] # 601020 <printf@GLIBC_2.2.5>
|
4005e6: 68 01 00 00 00 -> push 0x1 # rip+0x200a3a(601020) : 4005e6
4005eb: e9 d0 ff ff ff jmp 4005c0 <.plt>
2回目
00000000004005e0 <printf@plt>:
4005e0: ff 25 3a 0a 20 00 jmp QWORD PTR [rip+0x200a3a]-------># 601020 <printf@GLIBC_2.2.5>
4005e6: 68 01 00 00 00 push 0x1 # rip+0x200a3a(601020) : 4005e6
4005eb: e9 d0 ff ff ff jmp 4005c0 <.plt>
[1]Malleus CTF Pwn