type
status
date
slug
summary
tags
category
icon
password
在之前的时候打了强网拟态的比赛,这个比赛的质量还行吧,但是主办方真的是干的一手好操作,连出两个思路基本相同的题目,甚至其中有个的附件还提前泄露出来。
这个比赛中有一道题就是QWEN,这道题比较不错把,学到了不少好东西。
这到题目的开始是个下棋的程序,
这个下棋的玩意看了在ida里的源码,实在看不懂。读程序的能力太差了根本不明白这个玩意怎么样才算下赢
我是一直通过尝试的办法找到下赢的过程,
这里我尝试了一下,好像受从(0 0)开始只要是能连成一条线的最少5个棋子就算赢。
- (0 0)(0 1)(0 2)(0 3)(0 4)
- (0 0)(1 1)(2 2)(2 3)(4 4)
- (0 0)(1 0)(2 0)(3 0)(4 0)
最少5个算赢,多的只要能连成线也可以。
之后就来看一下这道题的全部流程
可以看到这里当我们赢了之后他会让我们输入一段数据,这里有一个很明显的栈溢出,但是这道题开启的pie和canary,这个栈溢出不太好直接用。
当输入完之后会让我们选择是否要再来一次比赛,如果在来就会跳到一开始比赛的地方重新开始。
这里就到了要看程序的时候了,我们整个过程中只有在赢了之后输入数据的地方中有个栈溢出,但不太好直接溢出于是我们要找这个程序在溢出的时候哪有问题。
我们可以看见在栈溢出后能覆盖v11的地址然后就是canary,我们就可以看v11的地址有没有什么特殊的作用。
程序先在v11里放入sub_1796这函数的地址,然后当v9=1时会进入sub_F81这个函数中,这里刚好带有v11,
这个函数的简单用法就是判断我们在下棋时下的位置是不是在棋盘内(每一个小于15),如果小于就正常往下运行,如果不满足就会直接跳到a1()地址执行,这里a1是sub_F81函数的第一个参数,然后之前提到sub_F81的一个参数传递的是v11,v11里放的sub_1796函数。
其实简单来说就是在v11里存放这sub_1796的地址,然后当我们输入的下棋的位置不满足时。程序就会跳转到v11里存放的地址去执行,就是执行sub_1796函数。
与是这里我们就可以知道我们能在赢了之后进行栈溢出,覆盖v11的的值,然后我们在输入N使程序重新执行一遍,在下棋时输入不满足条件的值,从而使程序跳转执行v11中,从而控制程序的执行,这里我们就可以直接输入ong_gadget,从而直接拿到shell,但现在的问题就在与我们要如何泄露libc的地址,于是我们就可以找找程序有没有什么后门函数。
于是我什么就在程序中找到这个函数,这个函数在程序中并没有在任何地方被使用,
然后这个函数的整体意思大致为,先输入一个密钥,如果和程序生成的数相同就往下执行,然后让我们输入数据,并向系统打开这个我们输入的数据(就把这个数据当做文件名打开这个文件),并把那个文件里的内容全部打印出来。
这里我们要先输入和程序相同的密钥,这个密钥在调试的时候会发现,其实每一次生成的是同一个,然后在输入的数据也有限制,但这里就有一个之前没有说到的知识点,就是通过打印/proc/self/maps 来泄露地址信息
具体的可以看这里
就是我们可以打印/proc/self/maps这个文件从而泄露程序的各种地址
就像这样,于是这里我们就可以向程序输入这个文件名数据,然后程序把这个文件内容打印出来,我们就可以拿到libc地址。
这样我们之后在让程序开启一此棋盘,赢了之后在输入的地方栈溢出,然后把v11的地址修改为ogg,然后就容易让程序执行拿到shell。
exp
这里
我们对ogg的选择为这个,因为这个的条件为rsp+0x70为,而在执行时rsp+0x70的地址刚好的我们栈溢出的第5个地址,
因此我们在第二次溢出覆盖ogg时要在输入3个p64(0)
这里感谢Arahat0大佬无私为我解答这个问题,跪谢大佬,贴下大佬的博客
这道还是比较考对程序的理解和泄露libc知识点的,也算是学到一点新东西吧。
然后这道题好像还有一个修改权限的问题,不过由于远程没了,就以后遇到再说吧。
强网拟态的还有一道glibc2.35的堆题,我后面在看又一篇讲large bin attack的文章时发现,这道题好像是个原题,并且就在那篇文章里有完全一样的脚本,可惜当时没注意到,这个题目的话是个large bin attack+house of apple的解法,可惜我不会,就先放下exp,等后面学了在来补吧。
exp
- 作者:wgiegie
- 链接:https://tangly1024.com/article/1373ecc9-5160-8039-aac6-e98bddab3f25
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。