[安洵杯 2019]game
[安洵杯 2019]game
知识点
- OLLVM
反编译
对源文件反编译
int __cdecl main(int argc, const char **argv, const char **envp) |
发现将flag转入v8,带入执行check1和check3,进入check1发现
__int64 __fastcall check1(char *a1) |
很明显为OLLVM,这样也能分析
有三个加密过程
1、交换前后的顺序 0-20,1-21
2、两个一组交换
3、 a1[v12] = (a1[v12] & 0xF3 | ~a1[v12] & 0xC) - 20;
def check1(): |
继续看check3
__int64 __fastcall check3(char *a1) |
check2
__int64 __fastcall check2(char *a1) |
逆向函数
def check2(): |
d0g3可直接获取,最后根据check1逆向即可
sudoku = [1, 4, 5, 3, 2, 7, 6, 9, 8, 8, 3, 9, 6, 5, 4, 1, 2, 7, 6, 7, 2, 8, 1, 9, 5, 4, 3, 4, 9, 6, 1, 8, 5, 3, 7, 2, 2, 1, 8, 4, 7, 3, 9, 5, 6, 7, 5, 3, 2, 9, 6, 4, 8, 1, 3, 6, 7, 5, 4, 2, 8, 1, 9, 9, 8, 4, 7, 6, 1, 2, 3, 5, 5, 2, 1, 9, 3, 8, 7, 6, 4] |
取反运算符逆向
tmp = ord(input()) |
解密OLLVM
说实话OLLVM混淆过的代码看不懂,这就需要解密了
其实在OLLVM混淆这片文章中写过了,这就不过多赘述了。