矿大BXCCTF-RE-普通的逆向

拖入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}

猜你喜欢

转载自blog.csdn.net/qq_38025365/article/details/82872707