BUUCTF reverse [网鼎杯 2020 青龙组]jocker
用ida32打开
逻辑很简单,程序先对输入得字符串进行检查是否是24位,不是24位则程序停止运行。
wrong函数里面是一个简单的与运算和异或减法的拼接
omg函数里面先给v2赋值,然后与wrong转换完之后的字符串进行比较。好像挺简单啊。
写了个脚本
flag这就出来了?果然,是个假flag,既然是假的我们就只能接着往下看,其实下面还有两个函数,但是之前以为是俩没用的函数,现在看来关键点应该就在这两个函数里面。
函数无法查看,怪起来了嗷,那我们进行动调,打开x32debug。
找到函数位置,直接下断点运行
这是整个函数,分析一波,应该是输入与hahahaha_do_you_find_me?字符串进行异或,然后与al进行比较,这个地方有点懵逼,整不明白为啥是与al进行比较,在403040这个地方有一串字符串,应该是与这个进行比较,无语,搞不明白,这个地方循环了19次,还剩下五次应该是在finally函数里面,跟进finally函数。
直接开始哭,可能还是太废物了,分析了半天没看懂流程,上面传入五个参数,肯定跟flag有关,某大佬曾经说过,逆向七分逆三分猜,这波直接猜异或。
贴出脚本
a = [0x0E,0x0D,0x09,0x06,0x13,0x05,0x58,0x56,0x3E,0x06,0x0C,0x3C,0x1F,0x57,0x14,0x6B,0x57,0x59,0x0D] b = 'hahahaha_do_you_find_me?' c = [0x25,0x74,0x70,0x26,0x3A] flag='' for i in range(len(a)): flag = flag +chr(a[i]^ord(b[i])) print(flag) d = (0x3A^ord('}')) for i in range(len(c)): flag = flag+chr(c[i]^d) print(flag)
flag{d07abccf8a410cb37a}