Skip to content

Commit 3e3f2ab

Browse files
committed
Add all remaining ones and edit readme
1 parent 207545c commit 3e3f2ab

File tree

22 files changed

+1389
-1
lines changed

22 files changed

+1389
-1
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
| [Hykilpikonna](players/Hykilpikonna/) | | (随便写写啦w) 来自未来的信笺, 狗狗银行, 超基础的数理模拟器, 超精巧的数字论证器, 超迷你的挖矿模拟器 |
7373
| [met](https://github.com/MetLee/hackergame2020-writeups) | 75名的菜鸡化学僧 | 签到, 猫咪问答++, 2048, 一闪而过的 Flag, 从零开始的记账工具人, 超简单的世界模拟器, 自我复读的复读机, ~~233 的字符串工具, 233 同学的 Docker, 来自一教的图片, 超简陋的 OpenGL 小程序, 生活在博弈树上-1, 狗狗银行, 超基础的数理模拟器~~, 超精巧的数字论证器, ~~不经意传输-1~~ (施工中) |
7474
| [WEGFan](players/WEGFan/) | | 超简陋的 OpenGL 小程序 |
75+
| [はるか](players/Haruka) | 思路分享 | 2048, 233 同学的 Docker, Flag 计算机, 签到, 狗狗银行, 超简陋的 OpenGL 小程序, 猫咪问答++, 一闪而过的 Flag, 从零开始的 HTTP 链接, 室友的加密硬盘, 来自一教的图片, 来自未来的信笺, 生活在博弈树上, 动态链接库检查器, 超基础的数理模拟器, 从零开始的记账工具人, 超精准的宇宙射线模拟器 |
7576

7677
## 其他资源
7778

Diff for: players/Haruka/2048/readme.md

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# 2048
2+
3+
好熟悉啊,但我真的不会玩 2048,还是右键看一下游戏代码好了。
4+
5+
看了一圈代码,发现游戏胜利之后执行的逻辑代码在 `static/js/html_actuator.js` 中:
6+
7+
```js
8+
HTMLActuator.prototype.message = function (won) {
9+
var type = won ? "game-won" : "game-over";
10+
var message = won ? "FLXG 大成功!" : "FLXG 永不放弃!";
11+
12+
var url;
13+
if (won) {
14+
url = "/getflxg?my_favorite_fruit=" + ('b'+'a'+ +'a'+'a').toLowerCase();
15+
} else {
16+
url = "/getflxg?my_favorite_fruit=";
17+
}
18+
19+
let request = new XMLHttpRequest();
20+
request.open('GET', url);
21+
request.responseType = 'text';
22+
23+
request.onload = function() {
24+
document.getElementById("game-message-extra").innerHTML = request.response;
25+
};
26+
27+
request.send();
28+
29+
this.messageContainer.classList.add(type);
30+
this.messageContainer.getElementsByTagName("p")[0].textContent = message;
31+
32+
this.clearContainer(this.sharingContainer);
33+
this.sharingContainer.appendChild(this.scoreTweetButton());
34+
twttr.widgets.load();
35+
};
36+
```
37+
38+
看来是经典 js 字符串拼接,于是 `'b'+'a'+ +'a'+'a'` 会变成 `"baNaNa"`(直接粘贴到下面 console 里回车也能给出来),那么直接请求 `/getflxg?my_favorite_fruit=banana` 就可以看到 flag。(这里略微 cheese 了一下,因为后端并没有验证参数大小写所以小写香蕉也可以
39+
40+
(……果然这道题的 flag 格式还是变成了 `废理兴工{...}`

Diff for: players/Haruka/233 同学的 Docker/readme.md

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# 233 同学的 Docker
2+
3+
首先先打开提供的 [docker hub 链接](https://hub.docker.com/layers/8b8d3c8324c7/stringtool),看看镜像的命令列表:
4+
5+
![image](https://user-images.githubusercontent.com/861659/98470501-58938b00-2229-11eb-8ad0-b18bcbf6928d.png)
6+
7+
看来在 27 行产生的 layer 里是有这个 flag.txt 的,但是 docker 并不能把单独的 layer 变成 image 来直接运行。不过既然他是单独的 layer,那么在 `/var/lib/docker/overlay2` 里就会有单独的存储。于是找一台机器 pull 下来 image 然后直接:
8+
9+
```
10+
# root @ raw in /var/lib/docker/overlay2 [1:19:43] C:1
11+
$ find . -name flag.txt
12+
./a157ba22c673b129100e1ce354675310999907a6aa3d401182d6096a2f78c76d/diff/code/flag.txt
13+
./fbb84b65568eda68e1fe72399e28de06eace16524cc8603cf8b96b6a0c84a0ab/diff/code/flag.txt
14+
```
15+
16+
于是打开文件就能看到 flag 内容了。
17+
18+
(顺便这个 flag 的内容好尬啊……

Diff for: players/Haruka/Flag 计算机/dosflag.py

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
from copy import deepcopy
2+
3+
4+
data_345c = 0
5+
data_3404 = 0
6+
7+
# data_3420 = [
8+
# 0x7E0AD9FC, 0x7F0FB626, 0x7E0BD9FC, 0x7F0FB63D, 0x7E0CD9FC,
9+
# 0x7F0FB634, 0x7E0EDD23, 0x7F0FB632, 0x7F0EB637, 0x7F0FB607,
10+
# 0x7E06C6B1, 0x7F0FB636, 0x7FF0C6B1, 0x7F0FB636, 0x7E0DC6B1,
11+
# ]
12+
13+
data_3420 = [0] * 15
14+
15+
data_2920 = [
16+
0x5075, 0x4AC5, 0x724A, 0x458C, 0x7194, 0x704A, 0x613A, 0x7133, 0x6654, 0x7C59,
17+
0x6800, 0x60C6, 0x49E4, 0x7164, 0x5DE1, 0x5981, 0x5B8C, 0x6496, 0x67AB, 0x5494,
18+
0x7A40, 0x57AE, 0x407A, 0x55BD, 0x58E9, 0x760D, 0x7325, 0x73B1, 0x4071, 0x59EE,
19+
0x5A8B, 0x783D, 0x5D45, 0x71F3, 0x7BB1, 0x67A6, 0x7D9F, 0x5837, 0x6B85, 0x7024,
20+
0x79F0, 0x4306, 0x7CF4, 0x7DBE, 0x5CC3, 0x5318, 0x531E, 0x6097, 0x7520, 0x62D7,
21+
0x5B95, 0x5A4F, 0x5A73, 0x66EA, 0x6715, 0x781B, 0x7114, 0x7ABA, 0x534B, 0x7C0E,
22+
0x78BF, 0x4966, 0x5340, 0x620B, 0x574C, 0x6341, 0x72AD, 0x56A4, 0x5C24, 0x707A,
23+
0x46D5, 0x6418, 0x55D4, 0x5B69, 0x60F5, 0x7A89, 0x6263, 0x7B1D, 0x4D80, 0x70A4,
24+
0x513A, 0x4F0F, 0x5FCB, 0x785E, 0x5DD0, 0x4622, 0x52EB, 0x4133, 0x7652, 0x5B5F,
25+
0x5002, 0x60F6, 0x7CE0, 0x77BB, 0x6D04, 0x58A2, 0x789B, 0x791B, 0x7C03, 0x4E0A,
26+
0x638A, 0x4883, 0x75BF, 0x6C8C, 0x6822, 0x66B7, 0x5ACC, 0x69CE, 0x6758, 0x5EBB,
27+
0x6FE7, 0x58FF, 0x6B44, 0x4AF3, 0x5AD4, 0x5E0E, 0x4B03, 0x668B, 0x46C1, 0x4C56,
28+
0x5FD5, 0x411A, 0x5DE6, 0x7FE8, 0x6FFE, 0x76E6, 0x670B, 0x489F, 0x759D, 0x678D,
29+
0x51D3, 0x6C30, 0x59A1, 0x6B96, 0x7D80, 0x6348, 0x54AB, 0x4BBD, 0x69CD, 0x72C4,
30+
0x4EC3, 0x526E, 0x78D8, 0x788E, 0x4736, 0x5590, 0x422A, 0x40C3, 0x50A1, 0x6B9F,
31+
0x58D4, 0x605A, 0x41C4, 0x5B0A, 0x6C0D, 0x678A, 0x6FCF, 0x7478, 0x4EC6, 0x72DD,
32+
0x5DAE, 0x755E, 0x4BA5, 0x615E, 0x4A55, 0x7EC0, 0x449F, 0x4304, 0x48F6, 0x6FB2,
33+
0x4D39, 0x6FD7, 0x64A9, 0x7A4D, 0x5F89, 0x77A1, 0x5541, 0x7473, 0x42D8, 0x7A8A,
34+
0x6301, 0x5F0D, 0x5DC5, 0x7B76, 0x78DE, 0x53C1, 0x7787, 0x596E, 0x465F, 0x4E1A,
35+
0x6CFD, 0x68F4, 0x55BC, 0x6BDE, 0x5B99, 0x5329, 0x4C84, 0x4DF3, 0x6DE5, 0x4138,
36+
0x7B15, 0x666B, 0x4DEA, 0x6CF7, 0x7058, 0x6F83, 0x6E9B, 0x40E6, 0x6596, 0x42E9,
37+
0x60C1, 0x6020, 0x4532, 0x4512, 0x4864, 0x44BD, 0x723F, 0x7075, 0x6983, 0x7491,
38+
0x7F80, 0x4464, 0x6C0E, 0x5BFC, 0x734A,
39+
]
40+
41+
data_33c0 = [
42+
0x00DD, 0xBFB6, 0x3094, 0x99FF, 0xAC7C, 0x63B9, 0x56A3, 0x2A9A, 0x3DDF, 0x6A1D,
43+
0xB289, 0xD716, 0xE29D, 0x1BA9, 0x37E4, 0x0088, 0xBFA8, 0x30C1, 0x99EC, 0xAC36,
44+
0x63B0, 0x56F7, 0x2AB1, 0x3DCA, 0x6A08, 0xB2CE, 0xD705, 0xE2F1, 0x1BF4, 0x37E9,
45+
]
46+
# data_33c0 = [0] * 30
47+
# data_33c0 = [
48+
# 0x55aa, 0x55aa, 0xddaa, 0xdd77, 0xdd77, 0xdd77,
49+
# 0xdd77, 0xdd77, 0xdd77, 0xdd77, 0x1877, 0x1818, 0x1818, 0x1818,
50+
# 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,
51+
# 0x18f8, 0x1818, 0x1818, 0x1818, 0x1818, 0x0030, 0x3810, 0xc66c,
52+
# ]
53+
54+
def try_time(time):
55+
global data_345c, data_3404
56+
data_345c = time
57+
data_3404 = 0x41c64e6d
58+
59+
def sub_1012():
60+
global data_3404
61+
data_3404 = (data_3404 * data_345c + 12345678) & 0xffffffff
62+
return data_3404
63+
64+
def main():
65+
count = 0
66+
for time in range(58379):
67+
result = [0] * 15
68+
# time = 0x25b3
69+
try_time(time)
70+
try_data_3420 = deepcopy(data_3420)
71+
for i in range(15):
72+
result[i] = sub_1012()
73+
for i in range(15):
74+
for j in range(15):
75+
try_data_3420[i] = (try_data_3420[i] + (result[j] * data_2920[i * 15 + j]) & 0xffff) & 0xffff
76+
flag = bytearray()
77+
flag2 = bytearray()
78+
for i in range(30):
79+
# flag.append((try_data_3420[i % 15]) & 0xff)
80+
flag.append((try_data_3420[i % 15] ^ data_33c0[i]) & 0xff)
81+
t = bytearray()
82+
for i in try_data_3420:
83+
t.append(i & 0xff)
84+
t.append((i >> 8) & 0xff)
85+
if b"flag" in flag:
86+
print(time)
87+
print(flag)
88+
count += 1
89+
print(count)
90+
pass
91+
92+
if __name__ == '__main__':
93+
main()

Diff for: players/Haruka/Flag 计算机/get_flag_system_1.c

+185
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
#include <stdlib.h>
2+
#include <string.h>
3+
4+
int VGA_256 = 0x13;
5+
int TEXT_80_25 = 0x3;
6+
7+
uint8_t vga_mem[200][320];
8+
9+
// ds = cs - 0010
10+
// naked literal pointers are ds
11+
12+
typedef struct {
13+
short x;
14+
short y;
15+
} Coord;
16+
17+
typedef struct {
18+
union {
19+
struct {
20+
uint8_t hour;
21+
uint8_t minute;
22+
uint8_t second;
23+
uint8_t ss;
24+
};
25+
uint32_t value;
26+
};
27+
} Time;
28+
29+
void set_video_mode_vga() {
30+
set_video_mode(VGA_256);
31+
}
32+
33+
void set_video_mode_text() {
34+
set_video_mode(TEXT_80_25);
35+
}
36+
37+
void remove_screen_with_color(int color) {
38+
memset(vga_mem, color & 0xff, 64000); // 320x200
39+
}
40+
41+
void wait_vsync() {
42+
uint8_t status;
43+
do {
44+
status = get_vga_status();
45+
} while (status & 8); // vsync pulse
46+
do {
47+
status = get_vga_status();
48+
} while (!(status & 8));
49+
}
50+
51+
short _strlen(char *a1) {
52+
return strlen(a1);
53+
}
54+
55+
short get_centered_x_coord(int len) {
56+
/* eax = 0x35 - a1 & 0xffff;
57+
edx = (unsigned int)eax >> 31;
58+
eax += edx;
59+
eax >>= 1;
60+
edx = eax;
61+
eax <<= 1;
62+
eax += edx;
63+
eax <<= 1;
64+
return eax; */
65+
return 6 * ((uint16_t)(0x35 - len) / 2);
66+
}
67+
68+
int sub_057c(uint8_t ch, int a2) {
69+
if (ch == ' ') {
70+
return 0;
71+
}
72+
int tmp = a2 + ch * 7 - 0x1c7;
73+
int res = *((char *)0x2d00 + tmp) - 'A';
74+
res = *((char *)0x2ce0 + tmp) - 'A';
75+
return res;
76+
}
77+
78+
void paint_coord(Coord coord, uint8_t color) {
79+
if (coord.x < 0 || coord.x >= 320) {
80+
return;
81+
}
82+
if (coord.y < 0 || coord.y >= 200) {
83+
return;
84+
}
85+
vga_mem[coord.y][coord.x] = color;
86+
}
87+
88+
void paint_line(Coord anchor, uint8_t color, char *data) {
89+
int i, col, ch, v5, x, y;
90+
Coord coord;
91+
for (int line = 0; line <= 6; line ++) {
92+
for (i = 0; data[i]; i ++) {
93+
char ch = data[i];
94+
v5 = sub_057c(ch, line);
95+
for (col = 0; col <= 4; col ++) {
96+
if (!((v5 >> (col & 0xff)) & 1)) {
97+
continue;
98+
}
99+
x = i * 6 + anchor.x - col + 4;
100+
y = line + anchor.y;
101+
coord.x = x;
102+
coord.y = y;
103+
paint_coord(coord, color);
104+
}
105+
}
106+
}
107+
}
108+
109+
void sleep(int time) {
110+
system_wait(time >> 16, time & 0x16);
111+
}
112+
113+
void _wait() {
114+
for (short v1 = 0; v1 <= 14; v1 ++) {
115+
sleep(800);
116+
}
117+
118+
}
119+
120+
Time get_current_time() {
121+
return *(Time *)dos_get_current_time(); // fake signature!
122+
}
123+
124+
void init_time() {
125+
Time time = get_current_time();
126+
*(uint32_t *)0x345c = time.value % 58379;
127+
*(uint32_t *)0x3404 = 0x41c64e6d;
128+
}
129+
130+
int sub_1012() {
131+
*(uint32_t *)0x3404 = *(uint32_t *)0x3404 * *(uint32_t *)0x345c + 12345678;
132+
return *(uint32_t *)0x3404;
133+
}
134+
135+
int main() {
136+
set_video_mode_vga();
137+
remove_screen_with_color(0x11); // 01 gray
138+
wait_vsync();
139+
short len = _strlen((char *)0x2e04);
140+
short res2 = get_centered_x_coord((int)len);
141+
Coord coord = { .x = res2, .y = 0xe };
142+
paint_line(coord, 5, (char *)0x2e04);
143+
// painting first circle
144+
_wait();
145+
remove_screen_with_color(0x11);
146+
init_time();
147+
uint32_t result[15] = { 0 };
148+
for (int v1 = 0; v1 <= 14; v1 ++) {
149+
result[v1] = sub_1012();
150+
}
151+
for (int v2 = 0; v2 <= 14; v2 ++) {
152+
for (int v3 = 0; v3 <= 14; v3 ++) {
153+
((uint32_t *)0x3420)[v2] = (
154+
((uint32_t *)0x3420)[v2] + (
155+
result[v3] * ((uint32_t *)0x2920)[v3 + v2 * 15]
156+
) & 0xffff
157+
) & 0xffff;
158+
remove_screen_with_color(0x11);
159+
// paint progress
160+
for (int v4 = 0; v4 < 0xff; v4 ++) {
161+
// waste time
162+
}
163+
}
164+
}
165+
remove_screen_with_color(0x11);
166+
// paint progress again
167+
for (int v5 = 0; v5 < 0xff; v5 ++) {
168+
for (int v6 = 0; v6 < 160; v6 ++) {
169+
// really empty
170+
}
171+
}
172+
_wait();
173+
set_video_mode_text();
174+
dos_print_string(); // ending messages
175+
176+
short v148[30];
177+
memcpy(&v148, 0x33c0, 30 * 2);
178+
179+
char flag[30];
180+
for (short v7 = 0; v7 < 30; v7++) {
181+
flag[v7] = (((uint32_t *)0x3420)[v7 % 15] ^ v148[v7]) & 0xff;
182+
}
183+
dos_print_string(flag);
184+
185+
}

0 commit comments

Comments
 (0)