BUUCTF_Youngter-drive
学到一些多线程和IDA平衡堆栈的知识!同样也是尽量写的详细!
解压后拖进IDA,发现UPX的壳,如图:
因为是exe文件,所以在windows上就可以用upx -d 把它给脱壳了,如图:
接下来就可以用IDA载入了,如图:
找到main_0函数就可以用F5大法了
一个函数一个函数来看,先看到sub_4110FF,点进去看看:
source应该是我们的flag,其他没啥东西,往下看,CreateThread创建了两个线程,MSDN文档1如下:
点进StartAddress查看线程,如图:
发现一个函数,点进去看,如图:
但是弹出了下面的错误:
翻译一下:
总的来说就是:411A04这个地址的堆栈不平衡,再说的通俗一点,就是IDA发现了一个SP的实际的偏移值是负数,需要我们手动去矫正它,我们按G跳转到411A04修改堆栈的值:
问题便出在这,如图:
点击Option -> Genereal -> Disassembly,把箭头所指向的选项勾上就可以看到SP的实际的偏移值 (左边绿色那一排)
下图一个很明显的负数,我们只要将上条指令的SP进行修正就可以了
按ALT+K,在SP值的前面加给负号修正它的负值
我们发现他的SP值变成了正值
现在就可以进行F5大法了,如图(注释尽力了T-T):
现在看下一个线程sub_41119F
并没有做什么,只是占着线程的计算器,每次运行dword_418008减1,现在理一下思路,线程1改变了字符串,而线程2没有改变,也就是说奇数改变偶数不改变,直到dword_418008减为0 ,线程结束,主进程也跟着结束.
打开sub_411880看看,将上面两个进程得到的字符串进行了校验.
现在可以开始写python脚本:
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)
运行得到结果:
至此,flag已经逆向得到了.
总结:
CreateThreadMSDN文档:https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread ↩︎