这是一道签到题,只不过比较搞,被骗了两次。
切入点:
个人认为这道题的切入点最好的就应该是从它要输出的字符串切入
很明显从这里可以进入将可以看到函数主要过程,我们双击跟进。
按‘x’查看引用,发现只有一个引用,跟过去。
这个伪代码比较长,不要着急,我们大致来分析下这一大串代码的逻辑。这两个memset是一个很明显的暗示,基本上memset的下面都会有scanf输入函数,所以猜测v15和v18是我们的字符串。同样的if判断里面的那个函数是strlen,这里我一个把它的名字改了。
第一个if里面的大致逻辑我们已经可以知道了,有个小问题就是其实v12,v13,v14的内存是连在一起的,所以可以把v12,v13,v14合在一起当做一个数组来看,不然在这个if里面的v12数组会越界。所以我们写一个小脚本看看输入的v15是什么
v12=[0x49, 0x6F, 0x64, 0x6C, 0x3E, 0x51, 0x6E, 0x62, 0x28, 0x6F, 0x63, 0x79, 0x7F, 0x79, 0x2E, 0x69, 0x7F, 0x64, 0x60, 0x33, 0x77, 0x7D, 0x77, 0x65, 0x6B, 0x39, 0x7B, 0x69, 0x79, 0x3D, 0x7E, 0x79, 0x4C, 0x40, 0x45, 0x43]
v15=""
for i in range(len(v12)):
v15+=chr(v12[i]^i)
print(v15)
#输出结果为 Info:The first four chars are `flag`
很明显这输出是一个带有一点点提示的坑,没关系我们的下面还有代码没分析,接着往下分析。
黄色部分不用想就是strcmp函数,然后就是这一串的相同的函数比较吓人,进去看看。
这个也看不太明白,再看看汇编代码
这个吸引了我的注意力,过去看看
这不就是原版base64吗,所以我们退回去,猜测那些函数都是base64的函数,所以这段逻辑已经清晰,输入->许多base64->比较
对这个里面的的东西不断base64解码,看看是什么
最后得到一个链接,很明显又被坑了,这时候注意到在刚刚的位置下面有一堆奇怪的数字
就想刚开始一样按‘x’看看引用
很明显这是在同一个函数中的引用,跟过去简单分析一下代码
这些伪代码看起来比较奇怪,我们再看看汇编,与伪代码对应一下提高效率
大致分析一下,看不太明白没有关系,最后知道v1在for循环后是一个固定的值,然后赋值给v4,接下来在这个if里面注意这个HIBYTE这个意思是取出V4最高位的字节,取出v1的最低位字节。再与它异或的数据一一对应,猜测v1和v4依次异或的结果其实就是“flag”,这刚好就与最开始的脚本结果相一致了Info:The first four chars are `flag`,所以分析得出v4,v1其实是已知的数据了。
最后就是循环的取出v4的各个字节与数据段异或
解题脚本为
a=[0x40, 0x35, 0x20, 0x56, 0x5D, 0x18, 0x22, 0x45, 0x17, 0x2F, 0x24, 0x6E, 0x62, 0x3C, 0x27, 0x54, 0x48, 0x6C, 0x24, 0x6E, 0x72, 0x3C, 0x32, 0x45, 0x5B]
b=['f','l','a','g']
c=[]
for i in range(4):
c.append(a[i]^ord(b[i]))
for i in range(len(a)):
print(chr(a[i]^c[i%4]),end="")
得出flag为flag{Act1ve_Defen5e_Test}
总结
这道题让我深刻认识到了逆向的猜想的特性,有一部分题都是这样的,要从字符串,或者一些数据作为切入点,通过交叉引用的方法找到主函数的地方,分析一部分函数时可能没必要弄懂其中的作用,可以先把了解的东西推完再看看它是否对于整个逻辑有影响。