2025CISCN&长城杯半决赛 PWN Prompt详细题解
1979414912351207 CTF 284浏览 · 2025-03-22 08:53

2025CISCN&长城杯半决赛

Prompt

Break:

checksec

seccomp

逆向分析

IDA分析:

main:

刚开始每个函数都点进去看一下,然后再protobuf_unpack函数中可以分析出来,这是一个套了protobuf的题目,所以第一步我们就先写出来他的protobuf的发包格式

逆向protobuf

image.png
图片加载失败


image.png
图片加载失败


image.png
图片加载失败


image.png
图片加载失败


所以他的发包格式为

还没学protobuf的,可以先去学一下protobuf

input_prompt:

protobuf_unpack:

分析protobuf_unpack函数可以发现,他首先要我们传入protobuf的大小,然后去判断我们传入的大小是否等于protobuf的大小,如果相同才会调用真正的unpack函数

然后继续分析主函数,发现他是根据我们传入的option进行不同函数的操作的

add:

add函数就是一个正常的创建堆块函数,最多可以创建16个chunk,并且每个chunk的size不能大于0x500,并且他还会将我们创建的chunk中的内容给清空,防止指针的残留,导致泄露基址,下面有个检查,检查我们传入的content_size是否小于chunk_size,这一步是防止堆溢出

delete:

delete函数并没有我们想要的UAF,他会给指针置零

edit:

可以看到edit函数中就存在了堆溢出的漏洞,因为v4是我们发包传入的size,相当于我们再一次写入了size,并且这个size我们还可控,所以导致了堆溢出

show:

show函数也是一个打印的函数,但是有一点就是他是通过printf函数打印的,printf打印是通过\x00截断的,这也可以导致我们通过堆溢出之后可以泄露地址

思路:

整体程序分析完成,存在的漏洞就是堆溢出漏洞,那么这题就很简单了,通过堆溢出导致堆块重叠, 然后再释放重叠后的chunk,然后按照申请时候的每个chunk大小申请回来,这就可以手动的构造出UAF漏洞了,有UAF漏洞,就可以进行泄露libc和heap的基址了,泄露完成之后。由于存在手动构造的UAF漏洞,就可以攻击tcache了,申请出来environ地址,然后再泄露栈地址,全部都泄露完成之后,再次攻击tcacahe打栈的返回地址,就可以进行ORW的ROP链子构造

实践:

第一步:构造堆叠

构造堆叠

image.png
图片加载失败


image.png
图片加载失败


可以看到chunk4的size部分已经被我们修改为了0x1041了,也就是此时的chunk4包含了chunk5,chunk6,chunk7

接下来释放掉chunk4

image.png
图片加载失败


image.png


chunk4被释放掉了,现在进入到我们的unsortedbin中了

第二步:泄露libc基址

此时如果我们再申请一个0x400大小的chunk,那么就会切割chunk4,然后chunk4中的libc地址就会被放入到chunk5中

image.png
图片加载失败


image.png


可以看到chunk5中残留了libc的地址,此时我们只需要打印chunk5就可以给他打印出来了

这就泄露了libc的基址

第三步:手动构造UAF

由于现在chunk5,chunk5,chunk7都被chunk4包含,我们现在只需要见他们都申请出来,这样就会出现有两个指针都指向同一个chunk的情况了

image.png
图片加载失败


可以看到有三个chunk都存在这种情况

第四步:泄露heap地址

由于现在存在两个指针指向一个chunk的情况下,我们可以释放掉一个,然后打印另一个,就可以泄露出来堆地址了

第五步:泄露栈地址

由于现在tcache中有我们刚刚释放的chunk5,然后我们此时在释放chunk6进去,然后修改chunk6,指向environ附近就可以泄露栈地址,注意,不能直接指向environ,因为add函数中存在申请chunk的时候会给chunk内容清空的操作,我们要申请到上面,然后将其填充满,然后再用printf \x00截断的点,来泄露

image.png
图片加载失败


第六步:构造ORW的ROP链子

还是跟刚刚泄露栈地址一样的操作,释放进去两个我们可控的地址,然后通过手动构造的UAF,将他修改到返回地址上去就行了,之后我们在将返回地址申请出来就行,在上面构造ORW的链子就行了

image.png


image.png
图片加载失败


最后就可以成功的获取flag了

image.png
图片加载失败


附件:
0 条评论
某人
表情
可输入 255

没有评论