****问题-1:****找到开头“This program cannot be run …” 这个字符串的内存起始地址(即字符串的指针),并准确计算该字符串的长度;

1.运行程序寻找字符串位置

img

  1. 打开IDA寻找字符串

发现无法找到目标字符串
img
3.通过for fun找到主函数,查看伪代码。

分析得知各功能实现应%S所实现的内容。

从而定位其地址*0x40004E*

img

4.将程序放入010Editor找到相应位置,然后数字节。

img

共计****44****个字节

****问题-2:****需要结合具体的加密操作逻辑,说明所发现的加密算法。

  1. 由第一个子函数可知,输入的字符串长度有固定要求。

输入内容被保存在byte_407444。

img

且长度必须为9.

img

2.打开第二个子函数,可以看见其中并无加密转码操作,还是在确认输入内容的范围。

3.在第三个函数

首先在18行有一次混淆交换

随后有sub_40210C(Str1, (int)byte_407444, 5)说明进行了另一种交换

img

进入发现是将byte_407444的前五个字符进行MD5加密。

img

随后密文Str1与Str2进行比较

img

4.根据以上推断,可知flag经过一次加密后,前五位经MD5加密后与Str2进行比较,后四位直接进行比较。

根据MD5要求写出脚本

img

得到密文为*K502G32Z2*

5.在解密第一层加密方法,这是一个类仿射加密

范思宇:通过dbg按顺序尝试各个字符的对应关系,从而一一对照找到原flag。

例如输入123456789,就可得知对应密文为0BEHKNQTW。

img

依次类推,可以推出原文为*5M1LE_L0L*

张原赫:找到初次转码后密文的储存位置

img

更改存储内容继续运行

img

得到结果。

img

不足:该方法可以得到结果但是无法拿到flag。

所以使用脚本进行转换

img

得到flag。