攻防世界reverse新手题wp(通俗易懂)


前言

之所以写这些题解,有几点原因,一是怕自己忘记(防止自己忘掉,就算忘掉也有复习的东西,别到时候连看的都没有)。二是,想与诸君共勉,同时给后来者提供一些微薄之力。


insanity

刚开始都比较简单(简单的题一般是不加壳的)
在这里插入图片描述
直接用ida打开搜索字符串就看到了flag了(很简单了)


python-trade

在这里插入图片描述
它说事py交易,我们可以想到python的pyc反编译,那去网上找找在线工具,就能看到源代码了:
在这里插入图片描述
这样可以看到它的逻辑,它有个加密,那我们就逆加解密呗。
在这里插入图片描述


re1

打开运行出现如下:
在这里插入图片描述
常规操作,用ida打开,搜索字符串,发现flag了,那就进行跳转转到伪代码
在这里插入图片描述
如下:
在这里插入图片描述
只要v3是0就行了,而它是比较v5和v9的,那我们就找到v5就行了,那追踪v5:
在这里插入图片描述
这时我们用十六进制转字符串,就可以找到了。
在这里插入图片描述
这时我们把字符串逆过来就时flag了。


game

界面如下,就是个游戏吗
在这里插入图片描述
其实只要输入从8到1就出现了flag了:
在这里插入图片描述
不过从逆向角度上看,先找到伪代码:
在这里插入图片描述

可以看到最关键的是sub_457AB4()这个函数,那进去看看:在这里插入图片描述
而上面都是一些原始的字符,上脚本:

a = [18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
b = [123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]
for i in range(56):
    b[i] ^= a[i]
    b[i] ^= 0x13
    print(chr(b[i]),end='')

这样就可以了


Hello, CTF

ida看看伪代码,找找有用的东西:
在这里插入图片描述
通过分析褐色部分,发现sprintf(&v8, asc_408044, v4);这一步很重要,那我们看看asc_408044这个是个什么:
在这里插入图片描述
发现了%x这个东西,说明与十六进制有关,那我们将原先发现的原始数字转换成字符串:
在这里插入图片描述


open-source

是个源代码,打开看看:

在这里插入图片描述

将条件的否转成事就行了,修改一下源代码就行了:
在这里插入图片描述
key如下:
在这里插入图片描述
做到这新手题一半就做完了,前面都是一些小意思了,我们需要整理一下,看看到这我们是否总结出一套我们做逆向的套路呢?


simple-unpack

看下题目,来分析一下我们所得到的信息(我们要有这种一步一步分析的思维,但又不完全同于逻辑思维)
在这里插入图片描述
它说了一个加壳了,那我们就看看到底加了什么壳(用到了一个检查壳的工具Exeinfo Pe):
在这里插入图片描述
既然知道了是upx的壳,elf文件,此时我们就要打开kali虚拟机,在这里插入图片描述
这就去了壳,再用ida打开:(汇编界面,或着字符串界面都能找到flag)在这里插入图片描述
在这里插入图片描述
这样这道题就完成了。


logmein

后面的题我大都在图上标出了一些做题要考虑的地方。
源代码如下:(源代码寻找就不说明了,因为太简单了)
在这里插入图片描述
发现关键的一步:
if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
其它都判断都是说Incorrect password!(输入错了)
而if的意思就是s的每8位对应v8的一位异或。到这就可以编脚本了:
在这里插入图片描述
这样答案就出来了(小细节应该都懂吧!)


no-strings-attached

如图:(那我们就想办法让它运行起来)
在这里插入图片描述
其它人的题解(wp)一般用的动态调试(gdb),以前做的时候没有用动态调试,而是静态调试,外加个脚本出来的。
动态调试(gdb)
在这里插入图片描述
先载入文件,辅以ida查看伪代码,发现关键函数:
在这里插入图片描述
我们就去查看一下运行到decrypt这里是内存里储存的值(用gdb查看)
在这里插入图片描述

静态调试:
从这里直接找到主函数
在这里插入图片描述
从主函数有好几个函数,我们就需要一个一个看看:
在这里插入图片描述
找到了authenticate()这个函数是关键的,而里面又发现了重要的函数,发现重要的函数:
在这里插入图片描述
decrypt函数如下:在这里插入图片描述
追踪一下s和a2的值,(Shift+e用于提取数据,会用到这个,方便一点)
那我们就可以上脚本了:
在这里插入图片描述
其实它这个就好像维吉尼亚加密似的,有一串密钥(轮换加密)


getit

如图,我们先找到字符串,发现了一些我们想要得到的东西,追踪一下:
在这里插入图片描述
找到伪代码:
在这里插入图片描述
看上面的伪代码,发现判断加密的一些东西,这么一大堆加密的,我们就要找到他们分别负责什么!实际上只有while里面的东西是我们要用到的,但我们考虑的时候(有时候我们要全盘考虑,在这之中要找到我们想要的一些条件)可以看到 strcpy(filename, “/tmp/flag.txt”) 这句,说明flag就在filename这里,下面又打印出filename它了,那我们就可疑判断在这之上的便是我们要找的加密了。
那我们分别找一下这些可疑的数据:

在这里插入图片描述
反复查看伪代码(其实是它这里反编译有点错误,毕竟是伪代码,不是真正的源代码),将53h转成字符为S,那下面的可疑字符串应该也是t的值。那就上脚本了:
在这里插入图片描述


csaw2013reversing2

下载打开运行一下:
在这里插入图片描述
用ida打开如下:在这里插入图片描述
此时我们用OD(或xdbg)打开看看(用字符串搜索定位):
在这里插入图片描述
然后修改代码运行即可:
在这里插入图片描述
此时flag不就出来了!(小意思了)


maze

一道有趣的迷宫题(有意思),还是常规操作,用ida打开:
在这里插入图片描述
找到伪代码,发现:
在这里插入图片描述
再找找成功的条件:
在这里插入图片描述
分别找找这些数据对应着什么,这样我们就有了些数据(不至于像闷头苍蝇一样)
在这里插入图片描述
总结下现有的数据:flag有24位,开头是nctf{,结尾是},还有个一串号。
这样我们就有了一些原始的一些数据,再看看判断条件:
在这里插入图片描述
整理一下我们得到的信息,我们可以大胆猜测,那串
号就是地图,而这四个判断就是上下左右了,再回过来看看,发现,这四个判断都会经过LABEL_15这里:
在这里插入图片描述
进去看看sub_400690这个函数:在这里插入图片描述
可知地图位8*8的地图,用python打印出地图:
在这里插入图片描述
那我们按照地图行走就是flag了,并且按照前面的信息可以判断出’O’,‘o’表示左右,’.’,'0’表示上下。而迷宫要要走到‘#’,找到路径为“右下右右下下左下下下右右右右上上左左”
这样flag就得到了:nctf{oo0oo00O000oooo…OO}


博客

整理不易,望一键三连。
最后:望诸君共勉!

posted @ 2021-11-15 22:30  望权栈  阅读(42)  评论(0编辑  收藏  举报  来源