cm50
- 程序类型 : .net程序
- 关键数据 :
int32 pn[] # 存储号码内容
this.point # 存储号码长度
this.contrast[] # 结果对比字符串
- 关键函数 button12_click
- 分析得到要求 (根据.net rlector 反编译结果):
- 正确结果长度为 5
- pn 每个元素 ^4 后 结果为[52 , 60 , 52 ,50 ,51] (this.contrast[])
#根据处理过程逆推 输入的号码
result = [52 , 60 , 52 ,50 ,51]
for i in result:
print(chr(i ^ 4) , end = " ") #结果 0 8 0 6 7
cm100
- 程序类型 : MFC
新的知识点 : od 获取输入框输入的断点 bp GetWindowTextA(W)
。在命令框中输入文字后程序断在该api处 ,然后使用alt + f9 从 user32块 返回到 CM100的程序段 ,再从 cm100 的调用块 返回到逻辑块 即可找到 目标代码段 ,返回后的地址在 4026A6 , 从ida中找到该地址( 在函数sub_402600中) ,根据下图两个字符串 找到关键函数 (改名为target)
- tip :
- 1.sub_402600 # 最终判断函数
- 2.sub_402310 # 处理和判断输入函数 :要求 :返回值不为0 即为成功
处理过程 :
- 1.对输入的 奇偶数位置 的字符交换 如 0 - 1 交换 7轮 外循环
- 2.对输入的 4的倍数位置交换 4-8 8-12 12-16 3轮 内循环
- 3 .解题方法 : 逆过程 , 得出结果
result = list("1H@Y1S0718760Dm3")
start = 14
for i in range(7):
start -= 2
temp_start = 12
while temp_start > 0 :
result[temp_start ] , result [temp_start - 4] = result[temp_start - 4] , result[temp_start ]
temp_start -= 4
result[start] , result[start + 1] = result[start + 1] , result[start]
for i in result:
print(i , end="")