前言:学习笔记。
常规:下载 解压 查壳。
有壳>>>脱壳。
32>>>32 IDAPro打开。
常规:先查找字符串>>>再进main()
分析main():
正向分析:
程序流程:
① 先给v4赋值,再提示”Please input:“ ,v6接收输入函数。
② 判断输入函数v6 (不重要、不影响分析。)
③ v5[i]接收。 v7~v9∈int类型 所以 4字节。
④ 循环12次。(结合③、④,大致猜测flag长度为12)
⑤ 判断不满足返回。(也就是得不到flag)
所以
猜测 v4[i]其实是 _data_start__[J] 加密之后的值。【先粗】
而 J不仅是_data_start__[的下标]【隐晦的告诉你J的取值范围】
且
J = V5[i](变量)-1(定值) 推出>>> J = X-1 >>>X=J+1( v5[i]看成X >>>避免分析时被[i] 影响)【后细】
编写C脚本:
编写思路:
提炼正向分析:
① v4的值(已知)
② _data_start__是一个数组且值(已知) 且J是下标。
③ v4 = _data_start__[]进行某种运算之后的值。
④ v5的值【也是就 X 】就是我们所求的flag。
所以,用已知的v4和 _data_start__ 进行逆推。(关键点:在于_data_start__[J]的理解、如何转换)
C脚本:
tip:对于的值提炼最好 Export data(shift +e快捷键) 这样能有效防止漏值、多值等减少出错(细节决定成败)【hex、dec优先,字符还是靠后吧 T^T >>>原因如下,,,】
易错点示范【不是】:(粗心导致>>>字符包含不全面。)
### tip:最好避免 Export data 字符【原因:仔细看你会发现,<;:9876543210/.-,+*)(',27h,'&%$# !"没有被包含在内】(已老实)
正确示范:(咱不使用字符了!! 太可恶了 T^T )
flag{X};
做题总结:
两个易错点:
① 数据的提取>>>现在更推荐使用hex 和dec 【卡了我好久T^T 】
② 对v4[i] = _data_start__[*((char *)v5 + i) - 1]的理解
一开始我写成 v4[i]==__data_start__[J-1] >>>求J,,,这就是对于②的理解不透彻。。T ^ T