BUUCTF_Youngter-drive


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已经逆向得到了.
总结:


  1. CreateThreadMSDN文档:https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值