文章目录
  1. 1. 0x01
  2. 2. 第一题
  3. 3. 第二题
  4. 4. 第三题

0x01

DDCTF比赛形式比较新颖,是解答一道题后会获得一个邮箱,将writeup发送到邮箱后会给你回复下一个题。而且是逆向和web交叉,如果解答不了当前题目就无法进入下一题,它考察一个人的综合技术素养。这个比赛到目前还没有结束,它为期十三天,但是邻近期末,各种结课作业,各种考试接踵而至,早已没有精力和时间再去做它了,所以提前写个博客记录一下比赛心得。

第一题

这个题是个64位的ELF文件,分析后我们发现byte_100001040[]这个数组里面的值做处理后得到v2,然后又将byte_100001040[]数组里面的之挨个减去2后,又和v2进行了按位亦或操作。然后输出结果。

下面是byte_100001040[]数组里面的值。

既然我们不知道V2的值,那我们对V2进行爆破,然后求得结果。
爆破脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for x in range(0, 256):
byte_100001040 = [0x41,0x10, 0x11, 0x11, 0x1B, 0x0A, 0x64,
0x67, 0x6A, 0x68, 0x62, 0x68, 0x6E,
0x67, 0x68, 0x6B, 0x62, 0x3D, 0x65,
0x6A, 0x6A, 0x3D, 0x68, 0x4, 0x5,
0x8, 0x3, 0x2, 0x2, 0x55, 0x8,
0x5D, 0x61, 0x55, 0x0A, 0x5F,
0x0D, 0x5D, 0x61, 0x32, 0x17,
0x1D, 0x19, 0x1F, 0x18, 0x20,
0x4, 0x2, 0x12, 0x16, 0x1E,
0x54, 0x20, 0x13, 0x14, 0x0,
0x0]
v2 = x
v1 = 0
while(v1 < 55):
byte_100001040[v1] = byte_100001040[v1] - 2
byte_100001040[v1] = byte_100001040[v1]^v2
v1+=1
v2+=1
str=""
for i in byte_100001040:
str+=chr(i)
print(str)

结果如下:

第二题

这道题是个APK,用AndroidKill不能查看java伪代码,但是Android逆向助手可以。我们发现验证条件就是将我们输入的字符串和i()这个函数返回值对比是否相等。

我们直接将这段java伪代码复制下来稍作修改,跑出i()函数的返回值,即flag。

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
public class FlagActivity {
public static void main(String[] args) {
byte[] p = {-40, -62, 107, 66, -126, 103, -56, 77, 122, -107, -24, -127, 72, -63, -98, 64, -24, -5, -49, -26, 79, -70, -26, -81, 120, 25, 111, -100, -23, -9, 122, -35, 66, -50, -116, 3, -72, 102, -45, -85, 0, 126, -34, 62, 83, -34, 48, -111, 61, -9, -51, 114, 20, 81, -126, -18, 27, -115, -76, -116, -48, -118, -10, -102, -106, 113, -104, 98, -109, 74, 48, 47, -100, -88, 121, 22, -63, -32, -20, -41, -27, -20, -118, 100, -76, 70, -49, -39, -27, -106, -13, -108, 115, -87, -1, -22, -53, 21, -100, 124, -95, -40, 62, -69, 29, 56, -53, 85, -48, 25, 37, -78, 11, -110, -24, -120, -82, 6, -94, -101};
byte[] q = {-57, -90, 53, -71, -117, 98, 62, 98, 101, -96, 36, 110, 77, -83, -121, 2, -48, 94, -106, -56, -49, -80, -1, 83, 75, 66, -44, 74, 2, -36, -42, -103, 6, -115, -40, 69, -107, 0, -21, -51, 57, 73, -26, 13, 55, -17, 84, -89, 14, -61, -85, 75, 39, 48, -69, -38, 44, -21, -115, -72, -30, -17, -107, -7, -91, 73, -87, 81, -94, 10, 84, 70, -8, -63, 26, 126, -76, -104, -123, -71, -126, -62, -23, 11, -39, 70, 14, 59, -101, -39, -124, 91, -109, 102, -49, 21, 105, 0, 37, -128, -57, 117, 110, -115, -86, 56, 25, -46, -55, 7, -125, 109, 76, 104, -15, 82, -53, 18, -28, -24};
int i = 0;
byte[] arrayOfByte1 = new byte[p.length];
for (int j = 0; j < arrayOfByte1.length; j++) {
arrayOfByte1[j] = ((byte) (p[j] ^ q[j]));
}
int k = arrayOfByte1[0];
int i1 ;
for (i1 =0;arrayOfByte1[(k + i1)] != 0; i1++) {
}
byte[] arrayOfByte2 = new byte[1000];
while (i < i1) {
arrayOfByte2[i] = arrayOfByte1[(k + i)];
i++;
}
for(int l=0;i<arrayOfByte2.length;l++)
{
System.out.print((char)arrayOfByte2[l]);
}
}
}

结果如下:

第三题

这个题是刚开始时一脸懵逼,它给了一个exe文件,一个x.jpg,一份Readme.txt
然而Readme是什么意思没看懂,到底x.jpg有什么用也很纳闷。

不管那么多了,先用文件格式分析器,查壳工具等等分析一波,发现这是个32位的exe文件,加了UPX壳,我们用ESP定律法两次脱壳后用IDA进行分析。
我们发现这个程序的逻辑就是先访问 http://www.ddctf.com/x.jpg, 然后将x.jpg的内容读取进来,进行了一些操作,最后返回一个reusult。

我们用IIS在本地搭建web服务,使得程序能访问http://www.ddctf.com/x.jpg。

读取到x.jpg的内容后进行了如下操作,我们发现如果if条件成立reusult就是flag

用OD动态调试脱壳后的程序,修改JMP语句为跳转,得到flag。

文章目录
  1. 1. 0x01
  2. 2. 第一题
  3. 3. 第二题
  4. 4. 第三题