GKCTF2020 逆向部分题的复现

逆向题目质量高,收获很多

0x1.Check_1n

提示语句是中文,IDA7.0要能搜到中文字符串。
1
找到密码错误的提示语句,查看引用。
2
拿到开机密码:HelloWorld3
输入HelloWorld,进入“桌面”,打开flag,会提示base64编码的Why don’t you try the magic brick game,提示玩打砖块游戏,玩打砖块游戏死了就出flag
4
另一种思路,看到奇怪字符串2i9Q8AtFJTfL3ahU2XGuemEqZJ2ensozjg1EjPJwCHy4RY1Nyvn1ZE1bZe,查引用,发现base58的关键数组。base58解密。

0x2.Chelly’s ldentity

Chelly是啥,一查,哦,看来师傅们都是老二次元了(手动狗头.jpg)。
C++程序,你来回点函数,发现有些变量可以变换,有提示作用。
函数多,逻辑理清楚,整体分三部分,输入一部分,算法一部分,最后结果比较一部分。算法又可分成输入校验和算法两部分。
1
原本的输入std::cin后面的变量,但发现下面判断长度的函数的变量不是input,而是instr,这样分析input赋值给instr。
sub_4111BD()判断长度:16字符。
sub_411721()是算法实现函数,点进去
2
找while循环,没循环如何遍历。有一个数组与输入字符的每个值比较,如果这个数组里的值小于输入字符,把它们累加起来,输入字符再和累加的值异或。关键是找这个数组,v9数组最早出现在sub_4116E0,点进去sub_4116E0
3
数组生成条件sub_411672,满足条件就放到数组里,进入sub_411672。
质数生成函数:生成0-128的质数.。4
算法搞清楚了,康康最后的结果比较函数。
5
赋值的那个数组就是结果数组。
脚本上场,登~ 登~ 登~(自带音效)

def is_prime_num(num):    #判断num是否为质数
	for i in range(2,num):
		if num % i==0:
			return False
	return True
def create_table(n): #生成n之间的质数列表
	table=[]
	for num in range(2,n):
		if is_prime_num(num):			
			table.append(num)
	return table
def de_anwser(_key):
	table=create_table(128)
	flag=''
	for k in _key:
		for ch in range(128):
			count=0
			i=0
			while table[i]<ch:
				count+=table[i]
				i+=1
				tmp=ch^count
				if tmp==k:
					flag+=chr(ch)
	return flag
key=[438,1176,1089,377,377,1600,924,377,1610,924,637,639,376,566,836,830
]
flag=de_anwser(key)
print(flag)
#flag{Che11y_1s_EG0IST}

0x3.BabyDriver

sys的后缀,驱动题,找DriverEntry。键盘过滤驱动
1
标准的键盘过滤驱动
3
因为是键盘过滤驱动,主要看下IRP读操作的回调函数(第二个函数),也就是CompletionRoutine的位置
2
发现是个地图题,就是上下左右由于键盘过滤驱动的影响,真实的值需要查表
maze类:1.内存中画出一张地图(地图变换) 2.明确起点和终点 3.(四个字符对应上下左右)flag就是走出的路径
地图:
地图
上下左右 IKJL在这里插入图片描述3
走出flag,LKKKLLKLKKKLLLKKKLLLLLL
输入md5加密后就是flag

0x4.WannaReverse

勒索病毒,自带换壁纸功能,拿到题还挺懵的,这就上勒索了(这么强吗_流汗.jpg)
拿到四个文件,主要逆向WannaReverse.exe这个,libcrypto-1_1.dll是openssl库来提供rsa的相关加密函数,clickme.exe是仿照wannacry病毒的界面程序(自带换壁纸功能),flag.txt.Encry是被WannaReverse.exe加密的flag。
我的IDA反编译的函数,函数名没有提示是那种函数,这就很难受,

WannaCryp勒索病毒,采用AES算法加密文件,并使用非对称加密算法RSA 2048加密AES的密钥,每个文件使用一个随机密钥。

大致流程:
随机生成一个AES密钥,用于加密文件,然后用RSA公钥加密生成的AES密钥,并将加密结果保存在被加密文件的文件头部。然后在clickme.exe中可以得到RSA私钥。那解密流程就很清楚了,把文件头的RSA加密结果拿出来用RSA私钥解密得到AES密钥”30776159143604297789676442413079”,然后用这个密钥对该文件的剩下内容进行AES解密。

from Crypto.Cipher import AES
from hashlib import md5

ciper = bytes([
    0x5C, 0xBC, 0xEA, 
    0x89, 0xBA, 0x2B, 0x18, 0x27, 0x79, 0x3F, 0x13, 0x0A, 0x8A, 
    0x97, 0xB4, 0x9B, 0xCD, 0x78, 0x9B, 0xD8, 0x35, 0x92, 0x05, 
    0x45, 0x4C, 0x22, 0xA5, 0x69, 0x37, 0xEB, 0x6E, 0x2B, 0x0E, 
    0xBD, 0x84, 0x0F, 0x91, 0x61, 0x38, 0xF6, 0xF1, 0xBA, 0x99, 
    0x19, 0x41, 0x72, 0x07, 0x91, 0xF0, 0x26, 0x68, 0x06, 0x61, 
    0x26, 0x5C, 0x20, 0x35, 0xDD, 0xCF, 0xFC, 0x77, 0x57, 0x54, 
    0x81, 0xF2, 0xF2, 0xE4, 0xAF, 0xBF, 0xA2, 0x1D, 0x29, 0xAE, 
    0x6C, 0x08, 0x3B, 0x76, 0x1B, 0x66, 0xB8, 0xFE, 0x72, 0xCB, 
    0xD6, 0x94, 0xC3, 0xD5, 0x6A, 0xE7, 0x0C, 0x7A, 0x28, 0xDC, 
    0xBC, 0xAC, 0x80
])
key = b"30776159143604297789676442413079"
aes = AES.new(key, AES.MODE_ECB)
c = aes.decrypt(ciper)

print(c)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值