坑啊,跳了一个双线程的坑,结果还有一个坑
对,这个题我觉得应该算是一个多线程的题
查壳是发现加壳了,而且是upx壳,脱壳吧
脱完壳,丢到IDA里打开,
main函数逻辑比较简单
sub_4110FF读取输入,运行两个进程hObject,v1
加密函数在StartAddress里,最后在然后在sub_411190里和TOiZiZtOrYaToUwPnToBsOaOapsyS比对 比对
从StartAddress跟进去看加密部分 StartAddress
看到加密函数sub_41112C,再跟进去时,提示
不能f5
这可能是堆栈不平衡导致的不能f5,到这个函数的汇编码去,并找到这里
汇编部分
看不到堆栈的话,option->general,把Stack pointer复选的勾打上就能看到了
显示堆栈
选中call,alt+k修改堆栈
修栈.PNG
然后就可以F5看加密部分了
加密函数
再回来main函数,看下面v1那个进程:
进程二
这个进程,好像没什么用,但它运行了--dword_418008,让计数器又减了1,并且可以看出是hObject、v1地交替运行,从而导致加密函数变成隔一个加密
写脚本:
s = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm' #off_418000
d = 'TOiZiZtOrYaToUwPnToBsOaOapsyS' #off_418004
f = ''
for i in range(len(d)):
if i%2 == 0:
f = f + d[i]
else:
if(d[i].isupper()):
f = f + chr(s.find(d[i])+96)
else:
f = f + chr(s.find(d[i])+38)
print(f)
好,f出来了:ThisisthreadofwindowshahaIsES
没交上去,好吧,有个坑没发现
dword_418008初始值为0x1d即29,也就是说下标从29开始,输入长度有30位,而sub_411190只比对了29位,需要再加任意一位,但貌似只有加E的交上去了
感谢这位大佬的wp,告诉我29的坑
https://l1b0.fun/13356/
网友评论