拖入IDA,找到主函数Main,反编译。
基本流程为输入一个字符串flag,然后进入sub_401070进行处理。
查看sub_401070函数
通过这里的格式审核,可知道flag长度为26,格式为 xxxx{xxxx_xxx_xxxx_xxx}
继续往后看
1处的名称,根据它们在栈中的位置与FLAG的距离进行改名。
2处可以看出前四个字符为flag,即flag格式为 flag{xxxx_xxx_xxxx_xxx}
使dword flag[16] = 319559941 显示成16进制
可以得知 flag[16][1]=0x19,注意flag[16][0-3]是从低位往高位读。并由flag[1-3]=lgh,可以推出该四个字符为cumt,所以flag格式继续知道为:flag{cumt_xxx_xxxxxxx_xxx}
继续向下看
进行一些赋值后,进入sub_4011C0函数
具体步骤功能如备注所示。
该部分的函数不好直接看懂,选择在OD调试里尝试看看。
用上述字符尝试。
根据汇编代码与静态代码,执行到该处汇编代码。
观察数据
可猜测加验证得到该6个c对应着6个x,又因为x在 abcdefghijklmnopqrstuvwxyz 对应着的下标 在 yxwvutsrqponmlzkjihgfedcba 中对应的 是 c,继续尝试使用abcdefg代入猜测,得到结果
所以不难猜出
只要找到 iueuihu 在 yxwvutsrqponmlzkjihgfedcba对应的下标 对应到 abcdefghijklmnopqrstuvwxyz中即可找到该七个字符
运行脚本
a='yxwvutsrqponmlzkjihgfedcba'
b='iueuihu'
for i in b:
print(chr(a.find(i)+ord('a')),end="")
得到 reverse
所以flag 字符格式 为 flag{cumt_xxx_reverse_xxx}
继续往回看
此处与flag[5]处的处理过程差不多,观察flag[4]可以知道flag[12]=0x66,继而往前算 可以知道 flag[10-12]=ctf
加上最后一句话 666 可以完整写出flag为 flag{cumt_ctf_reverse_666}