CTF逆向-[SCTF2019]babyre-WP_简单去花指令和流程识别
来源:https://buuoj.cn/
内容:无
附件:https://pan.baidu.com/s/1pWTpezTXnr_NN4lY9xWzag?pwd=m2zv 提取码:m2zv
答案:flag{ddwwxxssxaxwwaasasyywwdd-c2N0Zl85MTAy(fl4g_is_s0_ug1y!)}
总体思路
发现汇编中出现有红色部分,则说明反汇编失败,通常是有花指令或者说SMC(程序自己修改自己的代码)。
去除花指令指令后得到三道题,逐一解决。
第一题是迷宫题,注意题意没有明确,但是实际上是希望棋子移动的时候要每一步走在*
上面,即使是向下飞5格也是不能有其他符号的。
第二题是逆运算编码的问题,如果发现了是base64后可以取巧直接解题。如果没有发现,通过将值直接逆运算也能得到
第三题也是逆运算编码,难点在于反编译的代码稍微有些长。为了方便可以直接将题目中的伪代码复制到vs中调试,得到答案。
最终按题目给的样式,合并出flag
详细步骤
- 检查文件信息
- 发现了一些花指令
-
发现有类似于迷宫maze的字符串
-
输出地图,得到flag1的值为
sxss
- s:向下,x:飞到向下5格
-
继续往下,发现有调用
loc_22
,按p键,控制台弹出报错位置,双击跟踪[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vE5dVrTh-1648132866440)(https://raw.githubusercontent.com/serfend/res.image.reference/main/image-20220324195826038.png)]
-
发现这次是单个字节的花,花在0xE13处,使用
Edit
-Patch Program
-Change Byte
将0xE13改为nop(0x90)- 随后选中下面的数据,按下C键转换为代码。
-
回到loc_22处按p转换为函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04ExMCvd-1648132866440)(https://raw.githubusercontent.com/serfend/res.image.reference/main/image-20220324200316595.png)]
-
进入
f_encode
函数,发现是一个编码函数,有点像base64的无table编码方式-
其实此处只是运气好猜对,但正规情况应该通过爆破去逐个匹配每个字符
-
#include <stdio.h> unsigned int data[128] = { 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3E, 0x7F, 0x7F, 0x7F, 0x3F, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x7F, 0x7F, 0x7F, 0x40, 0x7F, 0x7F, 0x7F, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F }; int main() { int sctf_9102[3] = { 0x736374,0x665f39,0x313032 }; int i0, i1, i2, i3, i4, i5; for (i0 = 0; i0 < 3; i0++) { for(i1=32;i1<128;i1++) for (i2 = 32; i2 < 128; i2++) for (i3 = 32; i3 < 128; i3++) for (i4 = 32; i4 < 128; i4++) { i5 = (((((data[i1] << 6) | data[i2]) << 6) | data[i3]) << 6) | data[i4]; if (i5 == sctf_9102[i0]) printf("组%d:%c%c%c%c\n", i0+1,i1, i2, i3, i4); /**
-