西湖论剑2021-Re
感悟: 收获挺大的,同时意识到自己的做题思路和方法还有所欠缺,还是要做好应对体力活的准备。
1、ROR
1 |
|
主要就是对输入8个一组进行位运算,之后再进行表byte_405000的索引,看到立马想到z3,修改代码z3解密。
1 |
|
赛后整理的时候copy一遍就过了,比赛的时候出了点问题,卡了段时间。
另一种解法就是了解程序的位运算在干什么,v6数组对应的8位二进制每一位,单拿一小段分析。
1 |
|
exp:
1 |
|
上述两种方法都可以求逆,不过擅长使用z3来解这道题是非常迅速的,减少了代码分析量。
2、TacticalArmed
赛后复现,学到很多东西,基础还是⑧顶,尤其是对执行流程有修改的代码。
win逆向,有Tlscallback函数,开了一个进程,跟进进程处理函数。
1 |
|
存在Int 2d反调试,即正常运行会引发异常而检测到调试器则继续执行,所以真正代码逻辑在异常处理中。
分析代码知是对dword_405000这个内存中赋值了4个int,一般是修改key或某个解密需要的参数。
1 |
|
之后主函数内用到了一个函数指针v21,来表示lpadress的函数。
1 |
|
整体main函数如下
1 |
|
主要步骤是是while(size)里的循环,主要是代码的执行。
1 |
|
用switch case语句来进行不同变量的分发,比较新颖。
1 |
|
case语句的左侧是一个int的指针,所以右侧是一个地址,可以跳转到0x405648和0x405000,发现一个是输入的首地址,一个这是在Tlscallback中被修改过的int数据组的地址,还有一个&unk_405748,没有其他的交叉引用所以初始默认为0,(全局变量)。
而switch 和 case中用到的索引在dword_4052A8这个数组中,16进制高位为case索引,低位为寻址的下标。
综上,流程就是把src处的代码依次cpy到lpadress中,通过dispatch来修改操作数的值(操作数也是写入机器码中的),之后依次执行。这片代码通过v15控制一共执行33次,同时根据输入进行8个一组分组再循环上述操作。
Src = (char *)&loc_405010; src每次+16执行
mov操作后面都是00,所以需要dispatch来赋值。
1 |
|
脚本对4025A8数组处理,拿到修改操作数的流程。
1 |
|
如下:
1 |
|
分析到一半就能推出是Tea加密,轮数为33 ,default为0x7E5A96D2,既然分析出&unk_405748为sum,并且对他没有别的引用,所以再对密文多次加密时sum是在上一轮基础上使用的。
解密脚本:
1 |
|
3、虚假的粉丝
dos界面的代码动画,有点震撼,不过题目没设计到什么算法,主要还是读流程。
首先就是找到3个key,查看strings窗口,发现第一字符串很可疑,对其交叉引用发现了一个未被调用的函数,需要重新定义一下。
1 |
|
拉出去异或一下,是在读P./f/ASCII-faded 1999P.txt这个文件,打开查看,发现key。
1 |
|
之后它通过上述的key计算了一个新的文件,之后从中读取内容。
1 |
|
之后观察一个用到key的check结果的处理。
1 |
|
对5317进行异或之后再写入,再异或一次观察内容,后面就没什么内容了,就是接着奏乐接着舞了。
1 |
|
输入key跑起来还是挺不错的,摘掉眼镜.jpg。
A_TrUe_AW_f4ns
不过这题,静态的话就最后一个key有用,还是在文件中,并且U和S已知,直接文件搜索,也能拿到key,然后直接异或就可以了。
1 |
|
比赛时候挺麻的,比赛快要截止才有点感觉,还有一个硬件描述语言有待复现,计组实验课用的verilog神似,关键是不会啊! 人不行别怪路不平,还得补!。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!