baby_flash-222 简单的flash 的文件分析

这个题 我好早之前都做过

23333  应该当时 感觉太难了 然后就没有做把

参考链接 https://www.xctf.org.cn/library/details/e0d90ad9d0609320fd6743706135a80913d27b8d/

然后现在仔细看看这个题 也不算太难

我们一步一步的分析

其实这个东西一目了然我们看看有什么值得期待的函数

然后我发现了 F_strcmp();

然后我们看一下 最后边的窗口

那么 就需要我们 去哪里找这个函数了

但是在这之前  我们要想一哈

这个 函数的参数在那个地方。。。

然后我们去找这个字符串(点击二进制数据就有)

然后我们就去看看那个函数 我也是根据官方的 C++源码 看的 (其实和汇编差不多 只不过有些不太一样 而已)

package C_Run
{
   import avm2.intrinsics.memory.li32;
   import avm2.intrinsics.memory.si32;
   import avm2.intrinsics.memory.si8;
   import avm2.intrinsics.memory.li8;
   import avm2.intrinsics.memory.sxi8;
   
   [GlobalMethod]
   public function F_strcmp() : void
   {
      var ebp:* = 0;
      var i2:int = 0;
      var esp:* = int(ESP);
      ebp = esp;
      esp = int(esp - 44);
      si32(int(li32(ebp)),ebp - 4);
      si32(int(li32(ebp + 4)),ebp - 8);
      si32(int(li32(ebp - 4)),ebp - 24);
      si32(int(li32(ebp - 8)),ebp - 28);
      si32(2,ebp - 32);#给这个赋值 1 2 3 4
      si32(3,ebp - 36);
      si32(0,ebp - 40);
      si32(0,ebp - 44);
      while(int(li8(int(li32(ebp - 24)))) != 0)#两个字符串指针
      {
         if(int(li8(int(li32(ebp - 28)))) == 0)
         {
            break;
         }
         var i1:int = li8(int(li32(ebp - 28)));#取出一个int 值
         if(int(li8(int(li32(ebp - 24)))) == i1)#如果两个参数相同的话
         {
            var i0:int = li32(ebp - 40);#取出 3 的值 
            i2 = 1;
            if(i0 != int(int(li32(ebp - 32)) << 1))#如果1的值*2等于 3的值
            {
               i2 = 0;
            }
            i0 = i2 & 1;#不等于不会执行if
            si8(i0,ebp - 17);
            i0 = li32(ebp - 40);
            i0 = i0 + 1;#这里给 1的值加了1
            si32(i0,ebp - 40);
            i0 = li8(ebp - 17);
            if(i0 != 0)
            {
               si32(int(int(li32(ebp - 24)) + 1),ebp - 24);
               si32(int(int(li32(ebp - 32)) + int(li32(ebp - 36))),ebp - 44);
               si32(int(li32(ebp - 36)),ebp - 32);
               si32(int(li32(ebp - 44)),ebp - 36);#这里就是 把和给了 2 1给了3
               #
            }
            si32(int(int(li32(ebp - 24)) + 1),ebp - 24);#
            si32(int(int(li32(ebp - 28)) + 1),ebp - 28);# 取值 移位
            continue;
         }
         break;
      }
      i0 = si8(li8(int(li32(ebp - 28))));
      si32(int(int(si8(li8(int(li32(ebp - 24))))) - i0),ebp - 16);
      si32(int(li32(ebp - 16)),ebp - 12);
      eax = int(li32(ebp - 12));
      esp = ebp;
      ESP = esp;
   }
}

然后 这里写出脚本即可(无耻的调用了官方题解代码)

int strcmps(const char* s1, const char* s2) {
    char* p1 = (char*)s1;
    char* p2 = (char*)s2;
    int a = 2, b = 3, i = 0, t = 0;
    while (*p1 && *p2 ) {
             printf("%c",*p1);
        if (i++ == a*2) {
            p1++;
            t = a + b;
            a = b;
            b = t;
            //printf("%d ",a*2);
        }
        p1++;
        p2++;
    }
    return *p1 - *p2;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值