Y1rannn 发表于 2022-3-23 23:18

[XMAN2018排位赛]Dragon Quest

来一道ELF

打开一看这函数重命名名字就是C++题, 八成是要动调. 大概过了一遍匿名函数不多.

!(https://tianyu.xin/usr/uploads/2022/03/2568004954.png)


主函数逻辑明确, 读入, 变成std::string丢quest里

quest里和读入有关的基本上就是长度要0x40, 然后丢到sanitize_input要返回true, 其他的我们暂时先忽略

!(https://tianyu.xin/usr/uploads/2022/03/3276545595.png)

!(https://tianyu.xin/usr/uploads/2022/03/2698950228.png)

这个函数真的很长, 但是八成还是关键函数, 我们发现了一个success

!(https://tianyu.xin/usr/uploads/2022/03/1998531925.png)

而且这个表达式的数目让我觉得是一个z3题, 初值还要动调, 仔细看看吧.

感觉这里有混淆啊...插件上一上

!(https://tianyu.xin/usr/uploads/2022/03/3404104226.png)


果然... 去混淆之后整个逻辑又比较明晰了, 但是又要往下走一个函数...., 这样感觉上一个函数的变量名也是混淆用的, 不过上个函数我们已经分析差不多了, 基本猜的是对的, 我们需要这个check函数返回4919

!(https://tianyu.xin/usr/uploads/2022/03/1671772461.png)


这里整个一逻辑串, 应该是混淆没有去干净导致的:要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

把a压入v40这个vector

把v40给v34构造, 之后传进transform_input里, 结果要是hero.

那么只需要看看transforminput对这个vector干啥了就行, 目的就是有前i位flag就能结合hero算出第i+1位

额, 我简单看了一眼就是一个前缀和应该是? 讲真我怎么没看出来呢, 第一个字100多可见,之后每个间距都差不多...

!(https://tianyu.xin/usr/uploads/2022/03/580966328.png)


把hero提出来

```cpp
#include <cstdio>

int a =
{
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-a);
    }
}
// dr4g0n_or_p4tric1an_it5_LLVM
```

ps:原来dragon说的是llvm那条龙...

时速三百 发表于 2022-3-24 02:33

刚开始自学c++的萌新表示只能看出来这是c++:lol

wildbloom 发表于 2022-3-24 09:08

向楼主学习逆向技巧

iloveasdl 发表于 2022-3-24 09:14

向楼主学习逆向技巧

贪恋毅世的浮华 发表于 2022-3-24 09:46

感谢分享
向楼主学习逆向技巧

starlin 发表于 2022-3-24 10:09

学无止境啊

tangmumao 发表于 2022-3-24 11:46

感谢楼主

KenG3nME 发表于 2022-3-24 11:49

师傅厉害,学习了

石昊荒天帝 发表于 2022-3-24 13:06

Sagiri7 发表于 2022-3-24 14:19

向楼主学习逆向技巧
页: [1]
查看完整版本: [XMAN2018排位赛]Dragon Quest