文章目录
  1. 1. 前言
  2. 2. writeup
    1. 2.1. 0x00 404
    2. 2.2. 0x01 送分要不要
    3. 2.3. 0x02 Andy
    4. 2.4. 0x03 fuck===

前言

周六的时候抽空做了四道题,傍晚去班级聚餐之后就没弄了。这次的ctf挺有意思的,开题还要拿金币去买,哈哈。

writeup

0x00 404

抓包
flag藏在一个302的响应包里

flag:hctf{w3lcome_t0_hc7f_f4f4f4}

0x01 送分要不要

在文件加上后缀zip,可以解压,里面有张jpg,但是没什么用。
用binwalk提取文件,关注A362.7z,用16进制编辑器打开查看,有一串字符串

1
R1k0RE1NWlhHUTNETU4yQ0daQ1RNUkpUR0UzVEdOUlRHVkRETVFaWEdNMlVNTlpUR01ZREtSUlRHTVpUSU5aVEc0NFRFTUpYSVE9PT09PT0

base64解码:
GY4DMMZXGQ3DMN2CGZCTMRJTGE3TGNRTGVDDMQZXGM2UMNZTGMYDKRRTGMZTINZTG44TEMJXIQ======

接着再base32解码,base16解码,flag就出来了。python就可以base64/32/16解码

base32:
686374667B6E6E3173635F6C735F73305F33347379217D

base16:
hctf{nn1sc_ls_s0_34sy!}

flag:hctf{nn1sc_ls_s0_34sy!}

0x02 Andy

这题按思路下来虽然不影响解题,但是好坑…
apk反编译之后可以看到关键代码,MainActivity.java

1
2
3
if(MainActivity.this.make.andy().equals("SRlhb70YZHKvlTrNrt08F=DX3cdD3txmg")) {
Toast.makeText(MainActivity.this, "You get the flag!", 1).show();
}

于是去看Make.java,关键代码如下:

1
2
3
4
5
6
public String andy() {
this.reverse = new Reverse(this.input + "hdu1s8");
this.encrypt = new Encrypt(this.reverse.make());
this.classical = new Classical(this.encrypt.make());
return this.classical.make();
}

到这里就可以知道,进攻Reverse,Encrypt,Classical之后出来的密文串是”SRlhb70YZHKvlTrNrt08F=DX3cdD3txmg”,那么我们需要从Classical,Encrypt,Reverse逆回去。Encrypt是base64加密,所以逆回去是base64解密;Reverse是把字符串逆序;这两个过程都是比较简单的,关键是Classical

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
public Classical(String input) {
super();
this.array1 = "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z = A B C D E F G H I J K L M E O P Q R S T U V W X Y Z";
this.array2 = "W,p,X,4,5,B,q,A,6,a,V,3,r,b,U,s,E,d,C,c,D,O,t,T,Y,v,9,Q,2,e,8,P,f,h,J,N,g,u,K,k,H,x,L,w,R,I,j,i,y,l,m,S,M,1,0,O,n,2,G,7,=,F,Z";
this.input = input;
}
public String make() {
new String[0];
new String[0];
String[] v1 = this.array1.split(" ");
String[] v2 = this.array2.split(",");
int v4 = this.input.length();
int v3;
for(v3 = 0; v3 < v4; ++v3) {
String v0 = String.valueOf(this.input.charAt(v3));
int v5;
for(v5 = 0; v5 < 63; ++v5) {
if(v0.equals(v1[v5])) {
this.output = v3 == 0 ? v2[v5] : this.output + v2[v5];
}
}
}
return this.output;
}

仔细看可以知道其实逻辑也是比较简单的,相当于把array1和array2按顺序一一映射(array1->array2),那么逆回来的话就是(array2->array1),但是array1不是普通的字符表,仔细看,发现’E’是有两个映射的,分别对应’x’和’m’,没有’N’字符,所以如果逆过来运算的话级要注意

SRlhb70YZHKvlTrNrt08F=DX3cdD3txmg

Classical:
错误:OHMxdWRoZDBpMnczcmRuYXk2bjhkbmEE=
正确:OHMxdWRoZDBpMnczcmRuYXk2bjhkbmE=(因为’E’对应’x’和’m’,所以实际只有一个’E’)

base64:
8s1udhd0i2w3rdnay6n8dna

reverse:
and8n6yandr3w2i0dhdu1s8

sub:
and8n6yandr3w2i0d

flag: hctf{and8n6yandr3w2i0d}

0x03 fuck===

sha1漏洞,类似strcmp,如果是传入数组,他们俩判断正确,但是sha1无法处理数组,所以返回false

flag:hctf{dd0g_fjdks4r3wrkq7jl}

文章目录
  1. 1. 前言
  2. 2. writeup
    1. 2.1. 0x00 404
    2. 2.2. 0x01 送分要不要
    3. 2.3. 0x02 Andy
    4. 2.4. 0x03 fuck===