【NSSCTF逆向】【2023题目】《程序和人有一个能跑就行了》《encode》

CTF

Posted by Corax on September 30, 2023

#总览 程序和人有一个能跑就行了 trycatch rc4 encode 低高位操作 字符爆破 今天出去玩了 写完已经是半夜两点半了 睡大觉 #题目程序和人有一个能跑就行了 ##解法 这道题我比赛的时候是解出来了,但是解出来的很偶然 下面是我的过程。 下载下来是一个exe程序,exeinfo看一下,无壳32位。扔进ida 映入眼帘就是这个玩意,看到了两个字符串的样子的东西,留了个心眼。 因为函数跳转比较复杂,就直接string来定位 看看上面 ok,那大概就是buf1是程序里面的数据,然后我们输入的内容给buf2,key是litctf,加密出来喝buf1比较,所以我们现在只要buf1来解密就可以 。。fakeflag,刚刚我们还看到一个字符串对吧,也输入看看 输入就对了 rc4是https://gchq.github.io/CyberChef/ 。 但是既然再做一遍也必然不会这么浅尝辄止了。因为看这边 不管v8为何 u are right都会执行,那我们真正的flag是怎么做出来的呢,那段代码就是不不执行的吗?看了别的师傅的wp,学了很多东西。 首先是在这个地方下个断点,因为比较好奇的是为什么什么样的输入都会进入if的里面 ok 现在输出的是u are wrong。 执行到了这里 执行下去 步过5190 竟然tmd来到了正确flag的地方,我这个地方是步过了5190啊,那么在5190当中一定有什么操作让我们跳出了当前的这条指令来到了现在的这个地方,但是伪代码却没有表示呢?这个就比较有意思了。 5190到底做了什么操作,打开看看 依托代码,但是有用的函数只有这个红框的里面的东西,跟进 阅读代码 这个函数后判断某些东西,然后进入label9 在label9进入10 10中的关键代码就是框中函数,跟进 这个函数返回了一个a1+36,这跟跳转有个鸟关系? 看一下它的汇编 是通过寄存器来传的? 看看调用前是怎么处理的。 call了个这个玩意 到ida里面找到他 是一些线程操作,,暂且看不懂。 我的分析也就到这里了,网上别的师傅有讲是try catch来操作的,我对这些还有进程操作不太明白。 我的理解就是,我们输入一个字符串,进入判断后在一个函数内通过trycatch机制计算出偏移地址给eax然后通过寄存器传参跳转,绕过了ida伪代码的分析。 不过另外的一点是,虽然f5大法好,但多依赖是不好的,如果一开始没留意反汇编窗口,就会掉进fakeflag的坑了。 #题目encode ##解法 这道题就比上面那道题要简单很多了,exeinfo一看无壳32,扔ida了 通过关键字符串定位 逻辑也很简单呀,我们输入的东西被放在v5,然后通过对v5操作给到v4,v4再和一个字符串比较,对的话就是right了。 所以逆向思路就可以这样。用爆破法,对每个可以表示出来的字符,进行for循环内的操作,然后和这个未知的字符比较,如果对就输出他。 因为内置字符很长,懒得操作了哈哈直接用别的师傅的脚本了