By c10udlnk(https://github.com/c10udlnk)
自己总结编写的一些逆向常用脚本&&常见加密/编码的实现源码和比赛时用的处理脚本。
P.S. 鲁棒性不强,请保证使用时都是规范的,不然输出有问题就不是我的锅(逃。
对于各部分,readme按照其各子部分的首字母顺序进行排序。
持续更新ing...
运用angr爆破某些二进制文件(极简用法。
myAngr.py
:angr脚本,需修改path_to_binary(文件路径)和相应参数(比如find_address之类的)。
将Brainfuck源码转换为易懂的高级语言代码,在bfCode.bf
中输入brainfuck代码,运行相应的文件即可。
需修改brainfuck2HLPL_c.py
中set_HLPL_syntax()
函数中的配置以适应所需语言的语法。
-
bfCode.bf
:Brainfuck源码。 -
brainfuck2HLPL_c.py
:将Brainfuck转换为高级语言代码,以C语言为例,存入res.c
中。 -
res.c
:上述处理的结果输出。 -
brainfuck2HLPL_py.py
:将Brainfuck转换为高级语言代码,以Python为例,存入res.py
中。 -
res.py
:上述处理的结果输出。
还原代码中乱序赋值的数组,支持形如list[6] = 22
、v11 = 0x3
的赋值整理。
aProcOfManyEquals/aProcOfManyEquals.txt
:一些连续赋值的变量(实际上是为了混淆而拆开的数组)。aProcOfManyEquals/aProcOfManyEquals.py
:输出由aProcOfManyEquals.txt
还原的数组,支持多数组整合。
处理xor的SMC文件时的patch脚本,在IDA中File->Script file,导入脚本运行即可。
IDAPython/patch_SMC.py
:需修改相应的codeStart(smc起始地址)、codeLen(长度)和xorData(用来xor的key)。运行后在函数首地址按p
转函数即可。
Nop花指令时的patch脚本,在IDA中File->Script file,导入脚本运行即可。
IDAPython/nop_JunkCode.py
:需将l修改成相应的花指令类型,并按需修改start_addr和end_addr。运行后在函数首地址按p
转函数即可。
vm(虚拟机)题的辅助翻译机,在分析完各opcode的作用以后填入python文件中,生成伪代码。
-
VMinterpreter.py
:将各opcode的作用语句按格式填入ins_set中,再将程序中获得的opcode填入opcode列表中,运行即可。如有需要特殊处理的opcode,请填入elif中。最后伪代码输出到assembly.txt
。 -
assembly.txt
:上述处理的结果输出。 -
printf_VMinterpreter.py
:翻译自定义printf的printf虚拟机,将fm赋值为程序中的格式字符串,各格式占位符的作用语句填入ins_set中。如有特殊符号正则没有提取到,按需修改ptn。try中对参数的选取也要按题目实现进行修改,本例中的参数选择题目中的伪代码为:__int64 __fastcall func(FILE *stream, const struct printf_info *info, const void *const *args) { // ... width = info->width; prec = info->prec; if ( (*((_BYTE *)info + 12) & 0x20) != 0 ) //info -> left { v6 = &format[width]; } else if ( (*((_BYTE *)info + 12) & 0x40) != 0 ) //info -> showsign { v6 = &format[reg[width]]; } else { v6 = (char *)®[width]; } v7 = 0LL; if ( (*((_BYTE *)info + 13) & 2) != 0 ) //info->is_char { v7 = *(int *)&format[prec]; } else if ( (*((_BYTE *)info + 12) & 2) != 0 ) //info->is_short { v7 = *(int *)&format[reg[prec]]; } else if ( (*((_BYTE *)info + 12) & 1) != 0 ) //info->is_long_double { v7 = prec; } else if ( (*((_BYTE *)info + 12) & 4) != 0 ) //info->is_long { v7 = reg[prec]; } // opcode, e.g. movq *(_QWORD *)v6 = v7; return 0LL; }
最后伪代码输出到
printf_assembly.txt
。 -
printf_assembly.txt
:上述处理的结果输出。
其他一些稀奇古怪的小脚本。
printOpcode.py
:输出当前Python版本所有的opcode及对应助记符。bin2db.py
:64位二进制转double(小数)。myPwn.py
:自用PWN交互脚本。pexpect_Ix.py
:使用pexpect进行批量交互,可以在打开文件后持续输入输出(类似pwntools)。maze_bfs.py
:maze(迷宫题)的BFS解法。使用前需修改迷宫地图属性(地图maze、行r、列c)、起点和终点(start、end)、行走控制字符(FLAG_CHAR)、可通过条件。- ……
相关脚本存放于./_CRYPTO_
文件夹中,以下仍然按照字母排序。
一些工具:
Generate_inv_SBox.py
:S盒被魔改时,可用于生成逆S盒。
Base64/transBase64.py
:Base64标准编码/解码,增加换表功能。换表需要将myTable修改成使用的表,如不需要换表则可以在调用trans_Ba64encode/trans_Ba64decode时第二个参数留空。
参考链接:
MD5/MD5.c
:日常逆向最常见到的MD5写法(参考链接-1)。MD5/MD5
:由MD5.c
编译而来,可以用IDA pro打开以对比逆向代码。MD5/MD5_std.c
:常规MD5写法(参考链接-2)。MD5/MD5_std
:由MD5_std.c
编译而来,可以用IDA pro打开以对比逆向代码。MD5/MD5.py
:使用封装的MD5函数进行MD5值计算。
参考链接:
DES/DES.cpp
:DES加解密算法实现源码。DES/DES.py
:使用封装的DES函数进行加解密。DES/DES
:由DES.cpp
编译而来,可以用IDA pro打开以对比逆向代码。
参考链接:
RC4/RC4.cpp
:RC4加解密算法实现源码。RC4/RC4.py
:使用封装的RC4函数进行加解密。RC4/RC4
:由RC4.cpp
编译而来,可以用IDA pro打开以对比逆向代码