ALICTF REVERSE 200 WRITE UP
根据题目描述,得知这是一个加密程序,要求解出给出的密文,原文即为flag。
查壳看看,NICE!
没有壳,拖到IDA里直接找加密算法吧。OH FUCK!竟然加了花指令,干扰了IDA。
没关系,我们丢到OD里看看。找到主函数,压入了三个参数的,必然是主函数了。
因为C语言的main函数原型为
int main(int argc, char **argv, char ***env)
,所以这个连着push了三个参数的函数必然是主函数了。
好,我们跟进去。OH,花指令嘛。。。仔细分析一下,这么多个跳转,最后还是要向下走的,这就简单了。我们直接把004010D9到004010ED之间的指令全NOP掉。继续向下,会看到一个call 0040170A
,不知道是干啥的,直接去IDA里,按G后输入0040170A跳转过去,会看到里面还有几个call,在IDA里都跟过去看看,会发现是库函数,和文件有关,注意这个函数的参数,有文件名和"rb",估计0040170A函数是OpenFile之类的了。
下面遇到的不认识的函数也跳到IDA里去看看,很多都是库函数,其中两个fseek
和一个ftell
获取了flag.txt文件的长度。
继续向下跟,会看到call 00401000
,(如果你同目录下不存在flag.txt文件的话程序会异常退出,我们新建一个flag.txt,内容输入abcdefgh试试),跟进这个00401000,发现又是一坨一坨的花指令,比如这个00401004到00401017都是花指令,目的是为了干扰IDA,老方法,全部nop掉。然后就会得到加密算法了。算法还是比较简单的,我大概写了一下注释。
恩,可以发现一个字符加密后会变成两个字符。简单的说,就是字符a加密后,会变成0xXXXX的形式,其他字符也是一样。既然密文是给出来的,那现在就有个很神奇的思路,就是把A-Za-z0-9以及所有的符号全部加密一遍,就会得到一张明文密文对照表,OK,之后我们拿密文和这个表对比一下就能很容易的解出flag了。最后解得flag是a1dlo3i87@vt(#$^~kb25-+8=csm,%*4
PS,在程序的某个位置还有个检查flag.txt内容长度的地方,超出某个长度会退出,如果不改的话可能不能一次把所有的字符都加密完,要分多次完成,改掉的话一次加密就可以拿到整个密文表了。
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
'+(42463*42937)+'
Crawlergo
Crawlergo
CRLF-Header:CRLF-Value
eqndwididjpkmkertukr
Crawlergo