暑假第三周
[湖湘杯2018]Replace
先脱壳
直接定位到加密函数
提取byte_40150,byte_402151和byte_4021A0数据,照着写解密脚本,直接爆破
exp
1 | data = [ |
flag
flag{Th1s_1s_Simple_Rep1ac3_Enc0d3}
findKey
shift+F12定位到关键字符串,交叉引用后发现没办法反汇编
继续交叉引用,比如先交叉引用这个loc_401A37
跳转到loc_401948,继续交叉引用这个函数
发现这两个jz和jnz跳转是一起的,说明不管值是否满足条件都会跳转
所以这是个绝对跳转,并且我们也发现了这个loc_40191D有问题
IDA帮我们在右上角标红了
原因是在绝对跳转后的指令是肯定不会执行的
在他之后有个jmp指令,jmp指令跳转的位置刚好就是loc_40191D这个函数本身
那么他就会一直循环,ida就无法识别,但由于它在绝对跳转后面,
那他就不会影响程序正常执行,那么很明显,这就是花指令
我们直接用keypatch,ctrl+alt+k快捷打开插件
然后回到最上面第一个标红的地址按p生成函数,花指令就去完了
F5反汇编继续跟踪,sub_40401E跟踪一下
通过查阅微软官方文档CryptCreateHash第二个参数为ALG_ID值
继续查阅ALG_ID值,0x8003为MD5加密
继续分析,跟踪一下sub_401005,是个循环异或
提取到unk_423030值为
那我们只需要求string1,string1可以通过
1 | 0kk`d1a`55k222k2a776jbfgd`06cjjb |
与SS循环异或后解MD5得到
异或结果是c8837b23ff8aaa8a2dde915473ce0991
解MD5为123321
exp
1 | a = "0kk`d1a`55k222k2a776jbfgd`06cjjb" |
flag
flag{n0_Zu0_n0_die}
Hello, CTF
看主函数,没什么加密,单纯比较
把437261636b4d654a757374466f7246756e
转成字符串就行
exp
1 | print(bytes.fromhex("437261636b4d654a757374466f7246756e")) |
flag
CrackMeJustForFun
[XCTF2017]echo-server
先查看主函数,这个loc_80487C1+3明显有问题,应该是反汇编出问题了
查看一下汇编代码提示sp_analysis failed 堆栈不平衡,应该是有花指令导致IDA无法正确识别
按U转换成未定义数据,80487C1处的0E8h是常见的花指令干扰IDA分析的
直接patch成90h即nop,同时在80487C4处按下C键原本的一大堆数据就被识别成代码了
接着看下面标红的loc_80487F3内容就是一个jmp指令跳转的位置是loc_80487F3+1
跳转到自己本身这个函数第二条指令,相当于把第一条指令nop掉
我们看一下16进制数据是0EBh,也是常用花指令,patch成nop
同时在80487F4处按C将下面的数据识别成代码
可以看到8048816处仍有错误标红,按U转换成未定义数据,发现应该是字符串
将8048816处patch成nop,在8048817处按A转成字符串
接下来还有错的地方,我们看804884F处的跳转,先讲一下涉及到的汇编知识
test是逻辑与操作,不改变操作数的值
ZF是8086CPU的flag寄存器的第六位,
用于判断指令执行后结果是否为0,若为0,ZF=1,否则ZF=0
804884F处跳转由dword_804A088决定,dword_804A088为1时eax寄存器为1
test eax eax结果为1则将ZF置为0 jz short loc_8048866将不跳转
当dword_804A088为0时,eax寄存器为0
test eax eax结果为0则将ZF置为1 jz short loc_8048866跳转
这也是test的常见用途,用于查看寄存器是否为空
我们交叉引用一下dword_804A088,发现它只有在主函数中为引用,且被赋值为1
所以jz short loc_8048866不会跳转
而对于标红处的错误,mov ax 5E8h后ax=5E8h
然后 xor eax eax后eax=0,置ZF=1,则jz short near ptr loc_8048851+1跳转
陷入死循环,在标红的8048859处按U转换成未定义数据,发现一样有0E8h
patch成nop后再按c转换成代码
接下来要做的就是处理死循环,要让jz short loc_8048866跳转
要么修改dword_804A088的值为0,要么把jz修改成jmp直接跳转
然后选中标红的地址按p创建函数,F5反汇编
直接运行能得到flag
这是别人的运行结果,我的Ubuntu因为libcrypto版本问题,运行不了
试了sudo apt-get install libssl1.0.0:i386
也不行
flag
F8C60EB40BF66919A77C4BD88D45DEF4
[DDCTF2019]Windows_Reverse2
查壳ASPACK壳,没找到对应工具,找到一个UNASPACK但脱壳效果不理想
尝试利用OEP定律手动脱壳
用X32dbg打开文件,F9运行至pushad处,然后F8单步运行pushad
此时ESP寄存器指向BCF7EC
右键选择在内存窗口转到
在左下角内存窗口,选中BCF7EC,右键添加硬件访问断点
然后F9运行,可以看到已经跳转到popad后了
接着一直F8运行至486425处的ret 指令执行完
可以看到接下来有个jmp 指令,并且是个长跳转,跳转到4814B8
极有可能是OEP的位置,一直运行到jmp指令执行完
这个位置应该就是程序的OEP了,
用Scylla插件dump出文件
最后fix dump的时候选择带dump后缀的那个文件
fix完的带SCY后缀的文件就是脱壳成功的文件,可以直接分析
但无法运行,看了别人的WP才知道,
因为程序的重定位信息并没有被修复,我们可以通过CFF Explorer修改NT Header的"Characteristics",勾选"Relocation info stripped from file",程序即可正常运行
F5查看主函数,看样子要分析sub_4811F0和sub_481240
sub_4811F0分析如下,有点像为16进制准备的
sub_481240分析如下,整体就是16进制转字符串
sub_481240函数末尾有个sub_481000函数,点进去看有很明显的base64加密的特征
最后结果再和DDCTF{reverse+}比较
所以分析下来我们只需要求reverse+的base64加密,再转换成16进制即可
exp
1 | from base64 import b64decode |
flag
DDCTF{ADEBDEAEC7BE}
后记
在看雪找到了ASPackStripper可以使用ASPack脱壳
IgniteMe
有个大小写转换和异或,简单题直接上脚本
exp
1 | enc = "GONDPHyGjPEKruv{{pj]X@rF" |
flag
EIS{wadx_tdgk_aihc_ihkn_pjlm}
tt3441810
二进制文件,ida打开没有函数全是数据
用16进制窗口查看一下,依稀可以看到flag{},有h干扰
尝试连接一下得到flag{poppopret}
提交上去是错的,去掉flag{}包被,交poppopret就对了
吐槽一下,这脑洞真的不是MISC题吗完全不像RE
flag
poppopret
What-does-this-button-do
不知道什么文件,丢进DIE看一下是apk
尝试用jadx-gui打开,ctf.crackme里有MainActivity,点进去看看
大意是获取用户输入,若等于EYG3QMCS
就执行flagActivity
点击查看ctf.crackme里的flagActivity,就是flag输出
byd,攻防世界flag{w4nn4_j4r_my_d3x}提交上去又是错的,只提交w4nn4_j4r_my_d3x又对了,攻防世界能不能学BUU规范格式:sweat_smile:
exp
1 | d = [102, 108, 97, 103, 123, 119, 52, 110, 110, 52, 95, 106, 52, 114, 95, 109, 121, 95, 100, 51, 120, 125] |
flag
flag{w4nn4_j4r_my_d3x}
[第五空间2021]Strange Language
下载下来是由Python打包的exe文件
先用pyinstxtractor解包
用uncompyle6反编译main.pyc
main.py中只有导入brainfuck的mian_check
1 | # uncompyle6 version 3.9.0 |
先简单了解一下brainfuck
在解包文件夹中搜索brainfuck只有一个brainfuck.cp38-win_amd64.pyd
不了解pyd文件,搜索一下得知pyd就是一个类似.dll的动态链接库
.pyd 文件本质上是一个包含 Python 代码的库文件,可以被其他 Python 应用程序调用和使用。 通过使用Cython编译器,可以快速得把python文件打包为一个动态链接库,这个动态链接库也就是pyd。pyd相较于python源码本身可读性大大下降,很多人处于类似混淆得目的,也会使用这种形式对python代码进行保护
我们尝试用IDA进行,根据 python dll 模块的异常机制:python函数的末尾会调用 __Pyx_AddTraceback ,记录函数名,行号,文件名
我们尝试在字符串窗口搜索brainfuck.main_check
跟踪进去看看,对里面的变量进行跟踪,可定位到brainfuck代码
使用bf2any转换成任意代码
或者bfc转换成c代码
或者使用脚本解释
1 | def shrinkBFCode(code): |
观察到许多赋值,简单修改一下代码逻辑
可以得到enc,然后观察后续加密,根据逻辑推断是逐位异或
83,15,90,84,80,85,3,2,0,7,86,7,7,91,9,0,80,5,2,3,93,92,80,81,82,84,90,95,2,87,7,52
exp
1 | enc = [83, 15, 90, 84, 80, 85, 3, 2, 0, 7, 86, 7, 7, 91, 9, 0, 80, 5, 2, 3, 93, 92, 80, 81, 82, 84, 90, 95, 2, 87, 7, 52,0] |
flag
flag{d78b6f30225cdc811adfe8d4e7c9fd34}
Guess-the-Number
下载下来是个jar包,用jd-gui打开
两个16进制数 str_one 和 str_two 异或即为flag
flag
a7b08c546302cc1fd2a4d48bf2bf2ddb
[XCTF]re2-cpp-is-awesome
关键比较
off_6020A0和dword_6020C0如下,
dword_6020C0是索引,每一位后都有3个0,可以按U将数据转为未定义
然后每隔3个0即为索引
或者通过16进制窗口获取数据
exp
1 | index = [ |
flag
ALEXCTF{W3_L0v3_C_W1th_CL45535}