Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

引言

本次分享PolarCTF靶场中所有[easy]re题目的WP。

由于文章篇幅较长(一共有22道题目),分为两期发表,本期书接前文,分享下半部分内容,适合刚接触逆向的朋友。如果你也对逆向感兴趣,或者正在准备CTF比赛,希望这些内容能给大家一些帮助。

PolarCTF[C^]

image.png

64位ELF,直接运行:关键字符串“Please enter flag”

image.png

IDA启动!

image.png

fun1()a1[i] ^= 1u

image.png

check()用于判断a1是否和s相等:s = shfiu777

image.png

所以flag = shfiu777 ^ 1u


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main() {
char flag[] = "shfiu777";

for (int i = 0; i < 8; i++) {
flag[i] ^= 0x1u;
}

printf("%s", flag);

return 0;
}

再md5,32位小写加密即可

PolarCTF[babyRE]

image.png

64位exe。运行以后发现,随便输入会输出“Err”

image.png

看眼endoce():对flag的每位+2

image.png

那flag是啥嘞:shift+f12里有一串诡异字符。可以试试

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h> // Fixed from `<string>` to `<string.h>`

int main() {
char flag[] = "asdfgcvbnmjgtlop";

for (int i = 0; i < strlen(flag); i++) {
flag[i] += 2;
}

printf("%s", flag);

return 0;
}

PolarCTF[easyre1]

image.png

64位ELF。运行发现:会输出”no no no”

image.png

IDA启动!

image.png

挨个看吧。

enkey():循环32次,134520896 + 96 = 134520992

image.png

看看这俩内容都是啥:

134520896: key = 5055045045055045055045055045055

image.png

134520992: flag的位置

image.png

所以enkey()就是让flagkey按位异或。

reduce():循环31次,flag每位都-1

image.png

check():对比flagd^XSAozQPU^WOBU[VQOATZSE@AZZVOF

image.png

反过来就是:

  • d^XSAozQPU^WOBU[VQOATZSE@AZZVOF每位都+1

  • 然后和key按位异或


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h> // Fixed from <string> to <string.h> for strlen()

int main() {
char flag[] = "d^XSAozQPU^WOBU[VQOATZSE@AZZVOF";
char key[] = "5055045045055045055045055045055";

for (int i = 0; i < strlen(flag); i++) {
flag[i]++;
flag[i] ^= key[i];
}

printf("%s", flag);

return 0;
}

PolarCTF[Sign Up]

image.png

64位exe。直接运行发现关键字符串。

image.png

IDA启动!

image.png

image.png

非常eazy啊,key_num[i]-1 = name; key_password[i]-2 = password

key_num = 192168109; key_password = root

image.png


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h> // Changed from <string> to <string.h> for strlen()

int main() {
char key_num[] = "192168109";
char key_password[] = "root";

// Process key_num (decrement each character by 1)
for (int i = 0; i < strlen(key_num); i++) {
key_num[i]--;
}

// Process key_password (decrement each character by 2)
for (int i = 0; i < strlen(key_password); i++) {
key_password[i] -= 2;
}

printf("name = %s\n", key_num);
printf("password = %s\n", key_password);

return 0;
}

检验一下:

image.png

拼接起来md5即可。

等等,不对?

原来是眼睛不好使,没注意人家只替换了7个数

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h> // Correct header for strlen()

int main() {
char key_num[] = "192168109";
char key_password[] = "root";

// Process first 7 characters of key_num (decrement by 1)
for (int i = 0; i <= 6; i++) {
key_num[i]--;
}

// Process all 4 characters of key_password (decrement by 2)
for (int i = 0; i <= 3; i++) {
key_password[i] -= 2;
}

printf("name = %s\n", key_num);
printf("password = %s\n", key_password);

return 0;
}

这下对了!

PolarCTF[? 64]

image.png

64位可执行。

image.png

这,我猜是base64,直接在线解密试试:

image.png

赢!但是还是看看程序

image.png

image.png

遗憾!并不是base64的加密程序QAQ。收工

PolarCTF[Why32]

image.png

64位exe

image.png

image.png

image.png

image.png

这几个函数连起来的意思就是:input.len == 32

继续看Do()函数:input = cAry[i]-2; cAry = "2gfe8c8c4cde574f7:c6c;:;3;7;2gf:"

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h> // Changed from <string> to <string.h>

int main() {
char key_num[] = "2gfe8c8c4cde574f7:c6c;:;3;7;2gf:";

// Process each character (subtract 2 from ASCII value)
for (int i = 0; i <= 31; i++) {
key_num[i] -= 2;
}

printf("%s\n", key_num);
return 0;
}

这个half right是什么意思呢?

不管了先直接包裹上flag提交试试,比较这个看起来很像md5加密之后的值。

豪德,不对。

解密试试呢?

image.png

F1laig。这下对了!

PolarCTF[康师傅]

image.png

32位exe。IDA直接跟进main函数

image.png

input[i] ^= 9u == str1[i]

太简单了哇!直接str1[i] ^= 9u就是flag了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h> // Changed from <string> to <string.h> for strlen()

int main() {
char flag[] = "oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t";

// XOR each character with 9
for (int i = 0; i < strlen(flag); i++) {
flag[i] ^= 9u;
}

printf("%s\n", flag);
return 0;
}

PolarCTF[re2]

image.png

64位ELF,IDA直接启动。

image.png

PolarCTF[layout]

image.png

下载下来发现是apk。安装到雷电模拟器里看看。

image.png

疑似没做竖屏适配。调设置重启一下,发现还是乱码。

OK!上手段——jadx打开,直接搜索flag{

image.png

不对?!

好吧。回到雷电模拟器,用开发者助手提取:

image.png

这下对了

PolarCTF[use\_jadx\_open\_it]

这个名字——我听话,用 jadx 直接打开,然后搜索字符串:

image.png

结束

【未完成】****PolarCTF[另辟蹊径]

image.png

32位exe。但是注意:Section是乱码。丢进虚拟机里运行发现果然运行不了。

拽进ida里发现会创建一个新文件,感觉不对。 然后搜了一下writeup,好像这个文件有毒。暂停解题

PolarCTF[JunkCode]

image.png

32位可执行文件。IDA没看出名堂,进x64dbg试试。

根据题目名,猜测有很多无用代码,所以直接搜索字符串找到关键代码部分

image.png

简单分析(内容写注释里了):

image.png

分析认为junkcode.1F1258是判断函数:

  • 调用该函数后,有个jump,一个会输出funny(疑似成功?),一个会输出”no”。

  • 运行测试时,发现输错 flag 就会输出”no”

image.png

下断点准备跟进去看,结果发现eax里就是flag~

END
本文作者:白玉京

评论