bnnctf-re-Youngter-drive

拿到exe先查壳。
在这里插入图片描述
发现UPX壳,软件脱壳。
在这里插入图片描述
脱完壳将32位exe拉进IDA。F5。
在这里插入图片描述
先进入sub_4110FF()函数查看。
在这里插入图片描述
这里是输入flag。
再去查看sub_411190函数
在这里插入图片描述
这里是将输入的Source与一个数组进行比较,配对成功就输出flag。
这个程序是输入一个flag。经过两个线程进行加密,再进行比较,若相同则成功。
所以重点是这两个线程。
在这里插入图片描述
进入第一个线程的StartAddress查看。发现关键函数sub_411940,进入,发现无法翻译成C语言。看网上说是堆栈不平衡,通过Options -> General ->Stack points 可以查看堆栈。
在这里插入图片描述
发现问题在这里,这里通过点击call指令,alt + k 来修改此处的堆栈。因为执行pop之后超出了栈底,所以这里我们将栈顶指针SP增加4个字节。故输入-0x04。
在这里插入图片描述
修改完重新F5,发现可以进去了。分析下这个函数,大概是将输入的flag逐个进行运算。再对上层函数的查看,大概是从第29个开始循环,从后到前对Flag进行加密。
在这里插入图片描述
进入第二个线程,发现没对flag操作,仅仅dword_418008-1
在这里插入图片描述
结合第一个进程和第二个进程。很多函数看不懂。操作系统很多还没学。
WaitForSingleObject和ReleaseMutex 大概就像排队进屋子里工作,第一个人进去,用钥匙把门锁上。工作完了就打开门,把锁和钥匙交给下一个人。
这里则是第一个线程先响应,进去工作,第二个线程等待。等第一个线程做完了,释放权限,第二个线程工作。第二个好了第一个又等待进入,如此循环往复。故第29个字符由线程1操作,第28个由线程2,第27个由线程1…
在这里插入图片描述
在这里插入图片描述
可以编写脚本了。


```python
a = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasd'
final = 'TOiZiZtOrYaToUwPnToBsOaOapsyS'
flag = ''
for i in range(len(final)):
    if i%2 == 1:  #单数
        if (final[i].isupper()):
            flag += chr(a.find(final[i]) + 96)
        else:
            flag += chr(a.find(final[i]) + 38)
    else:
        flag += final[i]
print(flag)

结果是ThisisthreadofwindowshahaIsES
发现错误。。flag有30位,而最后只对比了29位。看网上说再加1位,怎么加,不知道。。最后加了个E,提交成功。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值