先查壳
有upx壳
用upx脱就行了
直接拖进ida
发现了createThread这个函数
这是一个创造线程的函数
所以我们可以进线程里看看
不过应当先看一下最上面那个函数
然而不能给我们提供有用的信息
这里就是线程了 不过还有一个函数我们可以进去看一眼
这里有的人会出现栈平衡问题(也就是sp问题)报错里会显示无法反编译
有出现的话到报错的地址改栈平衡即可反编译
直接分析代码
如果输入的不是字母的话直接退出
因为这里的ASCII码的值是大写和小写的a和z
如果不在范围之内则退出也就是不是字母则退出
然后分析下面的代码
如果是大写字母就继续
off里的值-38 和 -96
off里的值
再看下一个线程
纯纯占线程
每次运行dword_418008减1
线程1改变了字符串,而线程2没有改变,也就是说奇数改变偶数不改变,直到dword_418008减为0 ,线程结束,主进程也跟着结束.
(图和解释都是偷别人的,暂时不知道怎么实现的)
进入sub41190看看
对字符进行比较然后输出flag
这是off_418004[i]的值
得出思路
上面改变字符的奇偶与off比较得出flag
脚本如下
flagpart = 'TOiZiZtOrYaToUwPnToBsOaOapsyS'
flagrange = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
flag = ''
for i in range(len(flagpart)):
if i % 2 == 0:
flag += flagpart[i]
else:
if flagpart[i].isupper():
flag += chr(flagrange.find(flagpart[i]) + 96)
else:
flag += chr(flagrange.find(flagpart[i]) + 38)
Python isupper() 方法检测字符串中所有的字母是否都为大写
返回值
如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
flagrange.find(flagpart[i]) 查找flagpart[i]在flagrange字符串中的位置。