CTF

京津冀挑战赛 2016 sysndhy writeup

Posted by Jieming Gu on 2016-12-11

本文为2016年京津冀挑战赛中sysndhy的writeup。

Writeup

首先点我下载题目。直接使用jeb反编译,关键代码如下:

1

2

Base64.encode(input.getBytes())是对输入进行base64编码。

IDA反汇编so,发现check进行了加密处理。so中没有JNI_Onload,故只可能在init.array中解密check

3

4

5

init_array的code段还原成ARM指令:光标放在unk_4xxx上,按c进行还原。

6

7

init_array中解密check且解密后没有对check重加密,故动态调试时不设置断点,直接运行程序,此时内存中check已被还原,可以看到还原后的check

9

10

11

最后给出计算输入的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void main(String[] args) {
int[] array = {0x4B, 0x56, 0x47, 0x7B, 0x72, 0x7F, 0x4E, 0x55, 0x46,0x6A, 0x60, 0x4A, 0x50, 0, 0x7E, 0xA, 0x65, 0x7B, 0x5B, 0x47, 0x69, 0x44, 0xE, 0xE};
int tmp;
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 6; i++) {
tmp = array[i] ^ 0x11;
list.add(tmp);
}
for (int i = 6; i < 12; i++) {
tmp = array[i] ^ 0x22;
list.add(tmp);
}
for (int i = 12; i < 24; i++) {
tmp = array[i] ^ 0x33;
list.add(tmp);
}
byte []bytes = {90,71,86,106,99,110,108,119,100,72,66,104,99,51,77,57,86,72,104,116,90,119,61,61};
String answer = new String(bytes);
System.out.println(answer);
}

答案:decryptpass=Txmg