1.reverse_1
准备软件:IDA64
先运行,发现报错。
拖入IDA64,找到start函数,一直点击返回函数(start_0,sub_140012170,sub_140012190)。进入到 sub_140012190,发现函数最终返回Code。
跟进Code值,进入sub_1400123E0函数
继续跟进sub_140011159函数里的sub_1400118C0函数。发现关键信息。
读伪代码可知,程序先将Str2里的‘o’替换为‘0’,并储存。用户输入Str1后,程序与修改后Str2比较是否一致。
跟进Str2。
由之前的分析可得修改后的Str2为{hell0_w0rld}。验证flag{hell0_w0rld}
2.新年快乐
准备软件:IDA,Exeinfo pe
拖进IDA64,报错。
根据提示,怀疑加壳。拖进Exeinfo pe,发现是upx压缩且程序为32位。
拖进ub中脱壳。
将脱壳后的程序拖进IDA32,反编译正常。找到主函数_main,查看伪代码
发现仅仅是将V5和V4对比,无加密。结合题目提示信息,flag为一串字符。
则猜测flag为HappyNewYear!。验证flag。
3.XOR
准备工具:IDA,010 editor
拖进IDA64,进入主函数。查看伪代码。由伪代码可知程序先判断用户输入字串长度是否为33。接着对输入字串进行自身异或,且第一位没有改变,处理后与V3进行比较。
跟进V3,看起来不到33位。
转入16进制查看
仔细数,的确是33位,验证了先前对flag长度的猜测。
转入010 editor,提取出16进制数据。
写脚本。
得到flag:flag{QianQiuWanDai_YiTongJiangHu}。
验证。
4.不一样的flag
准备软件:IDA,Exeinfo pe
拖进Exeinfo pe,程序为32位。
拖进IDA32,进入主函数查看伪代码。由下图代码可知:
V6 == 1 -> V4--;
V6 == 2 -> V4++;
V6 == 3 -> V5--;
V6 == 4 -> V5++;
且0<=V4[i]<=4(感觉没用)
其余全部退出程序
继续分析,看到
发现V8没有初始化,怀疑V8只是工具人,既然是地址运算,且注意到
一算发现40H-41D=17H。也就是说
*((_BYTE *)&v8 + 5 * v4 + v5 - 41) = *(&v3 + 5 * v4 + v5)
那么他比较的其实是V3。由于V3是字符串,所以值比较可以化为字串比较。且字符地址取值后不能为1。
跟进V3。
继续跟进 data_start_。
和上面的字串比较符合。也就是说他是一个迷宫题。注意到V4被扩大5倍,且有关于V4的操作题目给的提示是UP和DOWN。
那么我们可以把字符串处理成5X5的格式。
*1111
01000
01010
00010
1111#
也就是说,从*开始只能走0,不能走1,并且最终走到#所使用的order为flag。就是下下下右右上上右右下下下,即222441144222。
验证:flag{222441144222}