re
checksec 一下发现加了upx壳,upx -d 脱壳
IDA f5发现
1 | _BOOL8 __fastcall sub_4009AE(char *a1) |
只能说,出题人真无聊,不过也挺有耐心的,直接跑脚本
1 |
|
encrypt
主要对输入字符串 s 执行两次操作,第一次是异或
由于我在IDA并没有找到v9的值 ,所以从gdb上一个一个记录下来了,但是其实后来发现v9是由sub_4006b6得来的,但是懒得去逆这个函数了(反正数据我已经拿到了)
1 | data = [0x10,0x59,0x9c,0x92,0x6,0x22,0xcf,0xa5,0x72,0x1e,0x45,0x6a,0x6,0xcb,0x8,0xc3,0xe4,0x49,0x5a,0x63,0xc,0xdf,0xf6,0x5f,0x8,0x28,0xbd,0xe2,0x10,0x15,0x1f,0x6e,0xaa,0x5a,0xca,0xec,0x80,0xaf,0x9b,0x16,0xbb,0x3d,0x13,0x2f,0x6a,0xa4,0xc7,0x2e,0xbc,0x4b,0x60,0x9a] |
异或后到了一个base64加密的位置,一开始我以为是base64加密,但是第一:没有表,第二:加了61,所以其实就是拿了base64移位的操作得到下标(0~64)然后+61变成可见字符 ,再跟’Z`TzzTrD|fQP[_VVL|yneURyUmFklVJgLasJroZpHRxIUlH\vZE=’对应
所以,思路就很清晰了
1、这串字符串-61得到base64的下标,对应上base64表得到base64加密结果,再解密回去
2、异或data得到flag
number_game
这道 题还算挺有意思 的,搞到最后是一个数独
先检测输入,只能是[0,1,2,3,4]
这里用递归将输入放在了堆块中,为后面的乱序做准备
这里打乱输入顺序写入a2,其实就是递归查找,当下一个(+8)没有时,就写入,所以顺序就是7381940526
继续往下,就是填数独了,填完检测,
1 | 1 4 # 2 3 |
1 | 1 4 0 2 3 |
所以填入的数据 是0421421430,根据打乱的顺序排回去得到1134240024