buu—Re(5)
[网鼎杯 2020 青龙组]singal
进入ida看主函数:v4被赋值unk_403040数组,然后有个操作函数vm_operad
进入操作函数:这是以v4数组里面的值为操作的函数,只需跟进v4数组的下标并进行相应的操作即可
1 | switch ( a1[v10] ) |
v4数组:因为是小端存储,所以前面三个0x00去掉,留下后面的
10, 4, 16, 8, 3, 5, 1, 4, 32, 8, 5, 3, 1, 3, 2, 8, 11, 1, 12, 8, 4, 4, 1, 5, 3, 8, 3, 33, 1, 11, 8, 11, 1, 4, 9, 8, 3, 32, 1,2, 81, 8, 4, 36, 1, 12, 8, 11, 1, 5, 2, 8, 2, 37, 1, 2, 54, 8, 4, 65, 1, 2, 32, 8,5, 1, 1, 5, 3, 8, 2, 37, 1, 4, 9, 8, 3, 32,1, 2, 65, 8, 12, 1, 7, 34, 7, 63, 7, 52, 7, 50, 7, 114, 7, 51, 7, 24, 7, 167,255, 255, 255, 7, 49, 7, 241, 255, 255, 255, 7,40, 7, 132, 255, 255, 255, 7, 193, 255, 255, 255, 7, 30, 7, 122
我们从第一个数字7开始,得到Str数组的值:34, 63, 52, 50, 114, 51, 24, 167, 49, 241, 40, 132, 193, 30, 122(至于为什么在7这里就是下一位,因为我数了,在7之前的任何一个数字你都不能说:它会不会参与操作,因为有+1也有+2,但是在7这里确确实实是下一位,因为7是+2,当时我还有点迷惑,数过就不迷了)
case 1 :唯一一个给v4赋值的
case 2 , 3 , 4 ,5 :都是给v5赋值的
case 7 :相当于continue
case 10 :输入
分析case:
里面的case1,操作了15次,说明v4跟flag有关,且v5是给v4赋值的,在操作期间进行了许多的变化,猜测v5是个中间变量,相当于进行加密。而v4则是最终的加密结果。
我整理了一下操作的case:
4,8,3,1,4,8,5,1,3,8,11,1,12,8,4,1,5,8,3,1,11,8,11,1,4,8,3,1,2,8,4,1,12,8,11,1,5,8,2,1,2,8,4,1,2,8,5,1,5,8,2,1,4,8,3,1,2,12,1
想着去逆一下,不过还是失败了
参考了大佬博客
和大佬博客
记录一下虚拟机逆向脚本吧:
1 | a1=[] |
reverse1
进入ida看主函数:
找到关键函数,如果Str里面有o,转化为0
找到Str2,所以flag就是hell0_w0rld
reverse2
进入ida看主函数
找到关键部分
内涵的软件
直接字符串查找得到flag
新年快乐
检查到upx
题目上说flag就是一串字符串,考察眼力,所以我查找字符串,猜一个:
flag还真猜对了
xor
进入ida看主函数,一个异或,然后对比
写脚本:
1 |
|
helloword
进入jdax,没想到随手一翻找到了😓
reverse3
看主函数,从后往前逆:Str2就是Destination进行for循环后的,所以通过Str2可以得到Destination。
进入sub_4110BE函数,发现是个base64加密(其实通过查找字符串能看出有个base64表,从而猜出有个base64加密)
v4就是base64加密后跟Destination对比的,所以得到Destination进行解密即可
脚本:
1 |
|
解密: