ddddynamic

点击此处获得更好的阅读体验


WriteUp来源

来自MO1N战队

题目描述

某工控设备突然运行变慢,似乎是在计算着什么东西,请您帮助他进行分析。Flag格式为:flag{}。

题目考点

  • mipsel逆向

解题思路

mipsel的程序,使用ghidra进行分析

提示说在很长时间以后会输出flag,猜测要进行算法的优化

观察solve函数与dfs函数

发现实质是一个最长上升子序列,自己进行优化算法即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <stdio.h>
#include <string.h>
int dp[10050];
int arr[10050], ans[15];
int n;

int max(int a, int b) {
if (a >= b) {
return a;
} else {
return b;
}
}

int solve() {
for (int i = 1; i <= n; i++) {
arr[i] = rand() % 11;
dp[i] = 1;
}
int maxx = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
if (arr[j] <= arr[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
maxx = max(maxx, dp[i]);
}
return maxx % 256 + 34;
}

int main() {
srand(0x666c6167);
n = 10000;
for (int i = 1; i <= 10; i++) {
ans[i] = solve();
printf("%d ", ans[i]);
}
printf("\n");
char output[18];
output[0] = 'f';
output[1] = 'l';
output[2] = 'a';
output[3] = 'g';
output[4] = '{';
for (int i = 5; i < 5 + 10; i++) {
output[i] = ans[i - 4];
}
output[15] = '}';
output[16] = '\x00';
printf("%s", output);
return 0;
}

Flag

1
flag{cZDdYCObrW}