BUUCTF RE Youngter-drive by YuSec

20 篇文章 0 订阅

Youngter-drive

Start

打开发现加了个UPX
在这里插入图片描述
想手脱,发现
在这里插入图片描述
好吧,直接脱壳机脱吧,脱完重新载入IDA
搜索字符串,将flag放在Source中,后面就没了
在这里插入图片描述
看看谁用了Source
在这里插入图片描述
发现四处引用的地方,除了当前的,还有三处
看到sub_411880
在这里插入图片描述
Sourceoff_418004常量字符串进行比较,这里应该就是最终加密后进行比较的
看到StartAddress_0
在这里插入图片描述
发现调用了sub_41112C进行处理Source
这里有个细节需要注意,dword_418008是临界资源,所以前面调用了WaitForSingleObject,用完之后当前线程Sleep,并且之后ReleaseMutex,先不跟进去看具体怎么处理,先看最后一个调用
main_0 :
在这里插入图片描述
发现创建了两个线程对dword_418008进行共享的操作
在这里插入图片描述
这里v2使用dword_418008这个资源时只是将其减一
在这里插入图片描述
并且两个线程轮流使用临界资源,用完一次就释放给另外一个线程使用
那么往下看到hObject中的关键函数,这里栈有误,修改一下就可以
在这里插入图片描述
在这里插入图片描述
修改完栈后就可以成功反编译了
在这里插入图片描述
off_418008[0] = QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm

这里的逻辑就是,当flag的某个字符中的值是大写字母时,就减去38作为下标,更改为off_418008中的值
如果是小写字母,就减去96

大写字母的范围为65 ~ 90,减去38的话得到的范围就是27 ~ 52
小写字母的范围为97 ~ 122,减去96的话得到的范围就是1 ~ 26

可以得出下标是不会重复的,所以只需要将
off_418004 = TOiZiZtOrYaToUwPnToBsOaOapsyS的字符去找off_418008[0] = QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm的下标即可
最后需要注意一点,dword_418008由于是轮流使用的,所以对Source的处理是隔一个字符进行处理的

exp.py
key = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
encrypt = 'TOiZiZtOrYaToUwPnToBsOaOapsyS'
encrypt = encrypt[::-1]

tmp = ''
for i in range(len(encrypt)):
	if i % 2 == 0:
		tmp += encrypt[i]
	else :
		index = key.find(encrypt[i])
		if index >= 1 and index <= 26:
			tmp += chr(index + 96)
		else:
			tmp += chr(index + 38)

flag = tmp[::-1]
print(flag)

# ThisisthreadofwindowshahaIsES

emmmm,最后提交的时候还有个坑,临界资源dword_418008的初始值为29,下标为29,说明有flag有30位,最终得到的只有29位,查了一下wp,发现加个E就可以提交,emm。

End

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值