CTF逆向-[SCTF2019]babyre-WP_简单去花指令和流程识别

本文介绍了如何解决一个包含花指令的CTF逆向工程挑战。通过分析和去除汇编中的花指令,逐步揭示了三个解谜任务:迷宫问题、编码解码和更复杂的编码解密。迷宫问题要求棋子移动时不经过*字符,编码解码涉及base64的类似编码,而最后的解密则需要理解并逆运算编码过程。最终,通过组合解得的各个部分,得出完整flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

详细步骤

  • 检查文件信息

  • 发现了一些花指令

image-20220324161958184

image-20220324162212422

  • 发现有类似于迷宫maze的字符串

    image-20220324162442017

  • 输出地图,得到flag1的值为sxss

    • s:向下,x:飞到向下5格

    image-20220324195708136

  • 继续往下,发现有调用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键转换为代码。

    image-20220324195904031

  • 回到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);
                                  /**
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值