TSCTF-J 2021 Reverse Official WP
by James
easyXor
签到。题目就是题解,xor加密后验证,这里要提多一句,选手可以再仔细分析分析反编译出来的while流程。这里给出相对应的源码,希望选手理解为什么ida反编译后的结果等同于这句源码。
解题脚本
1 | data = [ |
debugMe
送分题。可以发现判断了字符串长度与flag头是否为TSCTF-J
,然后输入的字符串直接进行比较了,所以动态调试查看buffer变量可以找到flag。这题没用动调的选手可以再做一遍
maze
送分题,这题做出来的人这么少属于是没想到,选手可以再分析下迷宫变量类型和程序流程。下图可以看出是个10x10的数组,v9,v10是数组索引
程序漏写了最后终点的判断导致有多解,标准解如下
1 | char map[10][10] = { |
UpxRand
这题和去年的PaintUpx是一个意思。upx脱壳后ida分析发现有Sleep函数卡住了导致图片输出不全,patch掉即可,修改汇编方法如下图
把sleep改成nop,修改后再点击上图中的Apply patches to input file
再打开软件扫二维码得flag
tic-tac-toe
井字棋,用exeinfope可以发现是c#写的,用dnspy打开
可以发现经典c# Form入口,045X7ZYGMK是Form类型
进入后多在几个地方下断点看看变量信息,可以发现有个判断赢了多少次的函数
修改变量绕过判断或其他方法获取flag即可
Minecraft
exeinfope可以看出是pyinstaller打包的,github找到pyinstxtractor.py脚本提取exe内容,找到main.pyc进行反编译,当中要注意解包脚本需要和打包时的py版本一致,否则会导致pyc无法反编译。
反编译结果中的关键信息
1 | def judge_flag(label_text): |
可见是单字节加密,爆破即可(也可以根据加密推翻),脚本如下
1 | enflag = [81, 77, 13, 81, 25, 180, 41, 237, 21, 233, 125, 65, 229, 209, 161, 192, 161, 125, 25, 85, 57, 185, 229, 125, 181, 141, 125, 196, 205, 185, 209, 125, 165, 81, 245] |
crackme
原题是有壳的,而且题目没有问题,有人说脱不出后就干脆不加壳。
main函数里的sub_401C50可以看出是检测进程名称,方法五花八门,总之绕过就行。
sub_401DB0是个SEH异常反调试,详情请百度
直接查看汇编,参考刚刚上⾯的源码,反调试的E9刚好起到了花指令的作⽤,patch一下发现了dword_408160有运算
再返回主函数汇编,发现藏了个函数sub_402870,基本所有常量字符串都加了异或加密,防止定位到这个函数,而且当中接收了输入字符串进行加密验证。
先看_Initialize_parallel_init_info函数,发现了NtSetInformationThread,这整个函数是隐藏线程防⽌调试⽤的,绕过就⾏(留意下dword_408160)
这个是smc,动态运行函数,当中有用到dword_408160这个变量进行解密
当反调试函数都过了,让dword_408160+=21,21,14,即dword_408160为56时才解密成功,从⽽调⽤函数,每个加密函数都有固定的花指令。函数分别是异或的变形,加减乘除取余
过了一层验证后还有md5限制多解,md5字符串也用异或加密了一下校验md5前控制台会输出提示正在做md5
提取md5字符串得到d57d1bc45d6f044959e2e796930a301e,脚本如下
1 | s = [ |
可以看出可以单字节爆破,写脚本即可,由于限制md5再写脚本遍历比较md5即可
1 |
|
flag是TSCTF-J{cRaCK_sMC_ls_S0_eA2Y_AnD_i_B3iLeVE_y0u_CAN_ALLKILL}