【攻防世界逆向】【高手题】《simple-check-100》《re2-cpp-is-awesome》《secret-galaxy-300》《elrond32》《hackme》

Crackme

Posted by Corax on September 30, 2023

昨天去参加LitCTF了,一共7道re题目,做出来了4道,后面的几道看了一下,不是现在的我能够解出来的,一没思路二没经验。不过也算满意了,这也算是我第一次参加比赛独立做题,加油吧。

#题目simple-check-100 ##解法 这道题我先打开idapro看了一下, 看起来也不太复杂,不过这种很明显的判断题目,我更想通过动态调试把它解出来,于是我去学习了一下gdb的调试。 先来分析一下这道题的汇编吧。 我们直接锁定 这里的判断函数应该是重中之重。看汇编代码。 也就是这个地方,jz指令很关键。 要先看test是什么意思 这是两个不同的值进行比较,所有测试位为0时,令ZF为1 而这里是test eax,eax来判断eax是否为空,只要不为空那ZF必定是0,为空则ZF为1。 jz和je一样,都是相等时跳转(eax为0时跳转),所以这里题目的本来意图是,通过call一个函数让eax为0,从而通过test置zf为1,让je或者jz跳转。 我们要修改的就是不让test成功置zf为0,怎么做?答案就是在它执行前,我们令eax为1就可以了。思路就是这样。 具体操作就是如下 首先gdb 文件,b main在主函数下断点,然后单步执行,到test的地方。 可以看到马上就要执行test了,输入i r eax看一下现在eax的情况 果然为0,我们通过set $eax=1,再看一下 ok修改成功,直接c 成功了! #题目re2-cpp-is-awesome ##解法 先用exeinfo打开看看。 无壳elf64位 扔进ida里面找到main函数 一大长串还是比较复杂的 放进linux里面./跑一下 告诉我们在尝试。 那我们只能转图去看ida了。一点点的分析吧, 可以看到是一个输出函数 应该是把输入的内容给了v3 这是后面a2的出现内容,可以看到这里有个取地址,那很有可能是我们输入的内容给了这个v12 又把v12的内容给了v11 v11的头又给了v10的头 这里不断把v11的尾部给v13,再和v10作对比 可以看到这里在判断传的字符是不是最后一个字。 主要看里面的判断 哦意思就是我们输入的东西和这个所谓的off_6020A0[dword_6020C0[v14]]是否相等,点进去具体看一下 是一个相当长的东西 另外一个 存了很多数字,并以3个0为填充。 基本上明白了,我们输入的东西应该是第一个字符串当中以第二个中的数,拼起来的一个字符串,写脚本 得到flag #题目secret-galaxy-300 ##解法 这道题也是一个很抽象的题目,给了我们三个文件,一个elf64,一个elf32,一个win32. win32的我电脑跑不起来,拿到kali里面跑一下elf格式的。 给我了个这么东西,很没头绪。 看了别人的wp,恍然大悟,题目隐藏的信息,那应该还有一个星系啊!打开ida追踪到星系名 这货没出现过,看一下在那些函数用过他。 是这么一个函数,这个应该就是我们要找的flag了,使用动态调试 跟进按a显示字符串,出现flag。 也可以用odg #题目elrond32 ##解法 exeinfo打开看一下, 用kali运行一下 大概知道会有什么回显信息。用ida打开看看 过程很了然,一个判断函数是关键。 输入的a2是0,也就是到了 这个地方,如果我们输入的是i也就是105的话,就会跳转到 a2变成7,到了115,也就是u,以此类推,要输入的应该是isengard。 我们直接输入 flag出现。 也有别的办法。 flag是通过这个地方的运算才出来的是什么东西。v2为何 一个数组。a1也就是我们输入的东西isengard 写个脚本flag也能出现 #题目hackme ##解法 又给我看超载了,直接去看了别人的wp。 先是kali中运行。 ok有回显,ida通过字符串锁定函数位置。 东西很多慢慢来,从下往上。 要让v21为1,就要让v16等于v19^15 再往上看,v16是什么 跟进看看 一个数组 那它的下标是什么? 看别人的wp,跟进去慢慢看发现这是一个随机数! 很迷茫,再看看v15 涉及到v11 跟输入有关,应该是我们输入的东西存储的地方。下标居然也是v17? 好,这题出的很飘逸啊。他是将我们输入的东西,去随机数k为下标,以同样的k去文件自己的字符串同样的位置是不是一样的,原来如此。那我们就不用去纠结v17的取值就行了。唯一要注意的也就是为什么是22以内的,看到文件自带的字符串反应过来原来我们要输入的就是22位的! 下面就是一些处理过程了,因为跟主逻辑没什么关系,在进行异或的时候直接照抄就可以了。 写出脚本 得到了flag