Hgame2021
week1
apacha
这个题目主要是加密过程比较复杂,加密为7次,每次都要先得求最后一个字符,然后依加密顺序的逆顺序根据左右字符来解密当前字符。
这里加密是有溢出的,
pypy
https://1.oss.hgame2021.vidar.club/pypy_65e4560b560f834dae3b59a409fe0f83.txt 这个题目主要是考察py入门,看得懂python字节码就能做。字节码直接查python文档。
这个是写的还原源码脚本,bytes那个返回的是bytes对象,可能会报错,但是不影响分析
week2
helloRe2
题目要求输入两个字符串得到flag,其实这两个字符串+一起就是flag,所以不能直接动调出来,而且因为这个题目用到多线程,所以用ida我连判断第二个字符串的地方都没动调进去(听说用OD可以)
第一部分
第二部分
BCrptEncrypt具体可以查看官方文档
密钥生成函数
pbsecret由共享内存得到,Name为加密算法
此为AES加密
共享内存建立函数
这个BE43A0由前面得到,是第一次输入字符串,与0-15进行异或后传递到共享内存作为密钥
加密iv是v12,(因为有iv所以是CBC加密方式)
BE312C就是IV,点进去看是0-15,长度不管,是16就行
第二次输入的字符串就是将输入的字符串用AES加密(因为由IV,应该为CBC模式,一次输入字符串与0-15异或后得到密钥,0-15作为IV,网上有输入为16进制模式的AES解密
BE30E0为加密后正确的密文
输入完后得到flag有一个坑,就是输入的两个字符中间有一个非法字符(不在ASCII范围内,那个要删去)
week3
第三周到目前为止一复现出来一道题,(当时做的时候都出了,结果我没注意脚本输出顺序,flag里面有些字符反了)
其他题目还存在一些问题,正在解决。
FAKE
char型存放在unsigned int里面,观察栈可以看出来v7对v6赋值,进入401216函数分析
发现这个是解36元方程组,先改v1,v39类型,分别改为int **,和int *,再写脚本进行清洗,这里可以用大计里面教的制表格来清洗,清洗完毕后用python来解,sympy库可以直接解方程,比较长我就放出来了。解出来发现是个假的flag,里面包含fake flag smc的提示。
因为函数不多,我直接挨着翻了,发现函数40699B
这里就是SMC自解密
IDC脚本
1 | auto = 0x401216; |
解出来之后感觉又是一个解方程,但是比刚刚那个简单多了。
这是一个矩阵乘法,管他是什么,当成解方程做又没错,和刚刚一样写脚本解就行了。
a_0: 104, a_1: 103, a_2: 97, a_3: 109, a_4: 101, a_5: 123, a_10: 95, a_11: 83, a_6: 69, a_7: 64, a_8: 115, a_9: 121, a_12: 101, a_13: 49, a_14: 102, a_15: 45, a_16: 77, a_17: 111, a_18: 100, a_19: 105, a_20: 102, a_21: 121, a_22: 105, a_23: 110, a_24: 103, a_25: 95, a_26: 67, a_27: 48, a_28: 111, a_29: 111, a_30: 100, a_31: 101, a_32: 101, a_33: 51, a_34: 51, a_35: 125
这里注意是a10在a5后面,我就是这里瞎了没看到(真正的星际玩家)
week4
vm
这个vm我调试了好久好久才摸清逻辑。
根据字符串查找找到关键函数
我是一步步的动调得到的大致逻辑,我并不知道有什么好方法来直接得出逻辑(大概只能猜测稍微快点?)
可以看到case里面的值与opcode的值做比较,如果满足条件,调用另外一个opcode2存放传过来的参数(地址)上面的值 v11为当前位置值,v5为下一位置。vm一般都会有指令集,每个指令控制不同的运行逻辑,根据后面的操作不难看出这个指令就是传过来的参数(地址)上面的值。
接下来就到了一步步调试的时间。
我讲其中几个标志位按照顺序改名为b1b2b3b4b5of(这个of只有后面比较用一次,那个类似于cmp,改变of)
大概判断出,b5 指令集下标 b4 栈下标 b3 输入流下标
首先进行的是测量字符串长度。
将输入字符串按照顺序取字符放到b1中,如果b2(初始值为0)等于b1,字符串结束,此时b3就是长度
然后把b3压入栈又赋值到b1中,将b1和b2比较(有指令将b2变为0x22),如果相等则跳转
后面就是两次加密,第一次是b2设置初始值为FE,与输入字符串异或,每次异或b2+0x23,下标–。第二次是输入字符串减去b2,每次b2则减少60,b2是unsigned char型。
1 |
|
r.exe(忘记名字了)
这个题目逻辑很容易,不能用查找字符串,因为这个字符串是动态解密加载进去的。直接硬调,还是不难的,根据输出判断关键函数。
这个函数对输入进行加密,点进去看,发现非常复杂,这个时候就需要好好考虑这个是加密算法的识别,挨着翻,可以看到sub_7FF63A903010中有一个256位的数组的使用,然后,有点想sbox了,检查一下前面几个值,这个就是aes加密(sbox固定)了,前面的密钥生成包含iv,就是aes的cbc模式,直接解密就能得到了。
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !