@TOC
这两个题在当时都没有做出来

shellcode

一看到附件是很多文件的题我就头大,包括上次那个省赛四叶草的内核题,无从下手,这次,我由于对web知识缺乏,没有一眼看出来part1是一个服务器,导致很多时间浪费在这上面,再加上这还是个go的服务器…..碰巧那天ida7.6的服务器还坏了

在这里插入图片描述
第一个难关:识别part1是一个golang的服务器
在这里插入图片描述
主要的代码还是在part3上,当时我也逆了这个,没有想到他把检测flag的逻辑放在了返回函数上,,我这也太粗心了吧,啥函数都看了,既然没有注意到这个艹
在这里插入图片描述
在这里插入图片描述
原封不动的rc4,key也给了,密文也给了…

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
54
55
#include <inttypes.h>
3 #include <stdio.h>
4 #include <string.h>
5
6
uint8_t f[]={0x64, 0x2e, 0x90, 0x34, 0x41, 0xd8, 0x24, 0xcb, 0x52, 0x2e,
0xfb, 0x39, 0x3e, 0x91, 0x7, 0xe, 0x96, 0xf6, 0x3c, 0x9, 0x9c, 0x21, 0x92,
0x21, 0xb2, 0xcc, 0x9f, 0x51, 0x48, 0x63, 0x4c, 0x8f, 0x72, 0x5d,
0xbf,'l','Q','v'};
7
8
void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) //
初始化函数
9
10 {
11 int i =0, j = 0;
12 char k[256] = {0};
13 unsigned char tmp = 0;
14 for (i=0;i<256;i++) {
15 s[i] = i;
16 k[i] = key[i%Len];
17 }
18 for (i=0; i<256; i++) {
19 j=(j+s[i]+k[i])%256;
20 tmp = s[i];
21 s[i] = s[j]; //交换s[i]和s[j]
22 s[j] = tmp;
23 }
24 }
25
void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len)
//加解密
26
27 {
28 int i = 0, j = 0, t = 0;
29 unsigned long k = 0;
30 unsigned char tmp;
31 for(k=0;k<Len;k++) {
32 i=(i+1)%256;
33 j=(j+s[i])%256;
34 tmp = s[i];
35 s[i] = s[j]; //交换s[x]和s[y]
36 s[j] = tmp;
37 t=(s[i]+s[j])%256;
38 Data[k] ^= s[t];
}
40 }
41 int main(){
42 uint8_t sbox[257];
43
44 rc4_init(sbox,(uint8_t*)"golangc2",8);
45 rc4_crypt(sbox,f,38);
46 printf("%s\n",f);
47 return 0;
48 }

replace

lua语言 我第二次接触,不过这种类型的题是第一次接触,很有价值

参考链接

b站有详细的讲解(28分钟开始)
https://www.bilibili.com/video/BV1Zh411q7cX

lua 语言的解释
https://blog.csdn.net/initphp/article/details/82703846
lua语言源码
http://www.lua.org/

解题步骤

还原lua语言

1查找字符串发现不能交叉引用,继续查找lua的字符串
2根据字符串查找可以找到lua语言的版本(5.3)
在这里插入图片描述

\x1BLuaS 是lua语言文件头的特征(S的ascii是53代表5.3版本)
在此进行交叉引用 找到lua的起始位置
在这里插入图片描述

3用idapython dump下来

1
2
3
4
5
6
start=0x46aa90
fp=open('dump.lua','wb')
for i in range(start,start+0xc25+1):
fp.write(chr(Byte(i)))
fp.flush()
fp.close()

4用luadec还原出lua语言

1
luadec.exe -f 0 dump.lua

分析lua语言

在这里插入图片描述

通过大致的分析,可以看出此加密算法为rc4,密钥和密文均已知,在rc4的前面还有两个函数
在这里插入图片描述这两个函数是通过上面的enclib加载的,只需在ida里搜索enclib 就可以找到这两个函数
在这里插入图片描述
在这里插入图片描述
一个是sub_4290d0 另一个是sub_4291100
分析即可得出这是一个base64换表操作

最后一个问题,就是这个题目为什么是叫replace,这个已经暗示我们其中可能有hook或者一些简单的替换操作
在rc4的密钥“RC4KEY”上下断点,就会发现密钥变成了good