这个题 我好早之前都做过
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;
}