BUUOJ 第一弹

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}

posted @ 2020-08-08 17:04  B1ank  阅读(740)  评论(0编辑  收藏  举报