拿到文件,IDA打开,进入主函数main():
通过分析,函数第60行为标志性的获取输入函数。
然后在第104行出现了关键函数判断:
其中v47是我们输入的字符串,所以第108行和109行也是关键函数,对我们的输入进行了加密。
先进入104行sub_140005910函数:
函数中有三个sub_140005A90函数 ,通过动态调试发现,就是将我们输入的字符串每一个都转化为十六进制数。
进入sub_140005A90函数:
因为在关键判断的函数中一共有三个将输入的字符转为16进制的函数,所以猜想flag一共有三段,并且发现,在关键函数sub_140005910中:
发现了两个判断,动调一下:
对应两个判断的汇编语句,然后就对应:
所以flag的格式应该是123@123#123
接下来我们需要找到这三个数,在main函数中:
先找到sub_1400029B0函数:
这里有个判断,如果不正确就会exit,所以,需要让这个语句成立,也就是flag的第一个数,
我们通过动态调试和爆破修改传入的参数的值,最终得到0x4e,即78。
再看这五个判断:
这五个判断可以得到五位数:
a = "eQDtW91a0qwryuLZvbXCEK8VghjklzxIOPASBNM2RsdfF56TYU34p7ioGHJcnm"
b = "De1ta"
c = ""
for i in range(len(b)):
c += str(a.index(b[i]))
print(c)
# 20637
得到flag中间的五位。
在main函数的147行:
也是一个判断语句,如果不成立就会exit,所以这句也必须成立。
通过动态调试:
得到v47为0x22
爆破一下:
for v47 in range(10000):
if (v47%0x22 == 12) and (v47//0x22 == 3):
print(v47)
#114
最终得到flag:
flag{78@20637#114}