来一道ELF
打开一看这函数重命名名字就是C++题, 八成是要动调. 大概过了一遍匿名函数不多.
主函数逻辑明确, 读入, 变成std::string丢quest里
quest里和读入有关的基本上就是长度要0x40, 然后丢到sanitize_input要返回true, 其他的我们暂时先忽略
这个函数真的很长, 但是八成还是关键函数, 我们发现了一个success
而且这个表达式的数目让我觉得是一个z3题, 初值还要动调, 仔细看看吧.
感觉这里有混淆啊...插件上一上
果然... 去混淆之后整个逻辑又比较明晰了, 但是又要往下走一个函数...., 这样感觉上一个函数的变量名也是混淆用的, 不过上个函数我们已经分析差不多了, 基本猜的是对的, 我们需要这个check函数返回4919
这里整个一逻辑串, 应该是混淆没有去干净导致的:要4919那么v11就要是False, v35上就是0, v12 & v14 就要大于等于零, hero[*v3]&\v35 > 0
v35又等于v25>>40 & v27 | 0x1C
这里v27就是循环变量i, v25是v44的length...balabal一大长串我就不絮叨了, 本身就是一个一个扣一个的过程, 解释下面四个箭头, vector相关操作可能会有点看晕,
v44是读入, v31是i, 那么a_i就是input[i]
把a[i]压入v40这个vector
把v40给v34构造, 之后传进transform_input里, 结果要是hero[i].
那么只需要看看transforminput对这个vector干啥了就行, 目的就是有前i位flag就能结合hero[i+1]算出第i+1位
额, 我简单看了一眼就是一个前缀和应该是? 讲真我怎么没看出来呢, 第一个字100多可见,之后每个间距都差不多...
把hero提出来
#include <cstdio>
int a[29] =
{
0, 100,214,266,369,417,527,622,
733,847,942,1054,1106,1222,1336,
1441,1540,1589,1686,1796,1891,1996,
2112,2165,2260,2336,2412,2498,2575
};
int main() {
for(int i = 1; i <= 28; i ++ ) {
printf("%c", a[i]-a[i-1]);
}
}
// dr4g0n_or_p4tric1an_it5_LLVM
ps:原来dragon说的是llvm那条龙...