BUUCTF——Youngter-drive
这是一道多线程的题目,主要理解了一下线程运行的一些问题
首先查壳,有壳,进行脱壳,手动失败了,linux里面upx -d就可以了
发现不能运行,应该需要修复,但这里比较懒,直接ida静态分析
StartAddress开始无法反编译,因为堆栈不平很,这里修改sp value,option-general-Stack-pointer选项可以显示sp值,这时用alt+k修改411a04地址为00便可以F5
比较简单的加密,判断输入字符,不是英文,直接退出,大写就减去38,从给的off表里面寻找值替换,小写就减去96
后面还有一个线程就是直接对dword-418008进行-1,这边就涉及到我的知识盲区了,根据大佬wp,两个线程应该算是交替运行的,第一个运行一下sleep,然后第二个-1导致奇数进行加密,偶数不加密,最后得出对照的结果
不过这是我的个人理解,如果出错了,还望大佬们多多指正
然后代码
def ask(m,tab):
c=""
for i in range(len(m)):
ind=tab.index(m[i])
if(i % 2!=0):
if(ind<=26):
c+=chr(ind+96)
else:
c+=chr(ind+38)
else:
c+=m[i]
return c
offs="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
m="TOiZiZtOrYaToUwPnToBsOaOapsyS"
print (ask(m,offs))
最后比较的应该是30个字符串,后面要加一个字符,但不知道为什么大佬说在后面随便加,我试了试别的字符提交都失败了,就大佬加的E成功了,这里还是不清楚。。。。
附上大佬的wp,还有error of " positive sp value has been found"的讲解
https://l1b0.fun/2018/08/18/%E5%AE%89%E6%81%92%E6%9D%AF-7%E6%9C%88%E6%9C%88%E8%B5%9B-Reverse-Youn