見出し画像

HSCTF 7 write-up

6月1日12:00〜6日00:00 (UTC)に開催されたHSCTFにソロで参加しました。1120ポイントで1466チーム中474位でした。

以下、writeupです。

---------- Reverse Engineering ----------

* AP Lab: Computer Science Principles

This activity will ask you to reverse a basic program and solve an introductory reversing challenge. You will be given an output that is to be used in order to reconstruct the input, which is the flag.

Author: AC

与えられたプログラムは以下の通りである。

import java.util.Scanner;
public class ComputerSciencePrinciples
{
  public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      String inp = sc.nextLine();
      if (inp.length()!=18) {
          System.out.println("Your input is incorrect.");
          System.exit(0);
      }
      inp=shift2(shift(inp));
      if (inp.equals("inagzgkpm)Wl&Tg&io")) {
          System.out.println("Correct. Your input is the flag.");
      }
      else {
          System.out.println("Your input is incorrect.");
      }
      System.out.println(inp);
  }
  public static String shift(String input) {
      String ret = "";
      for (int i = 0; i<input.length(); i++) {
          ret+=(char)(input.charAt(i)-i);
      }
      return ret;
  }
  public static String shift2(String input) {
      String ret = "";
      for (int i = 0; i<input.length(); i++) {
          ret+=(char)(input.charAt(i)+Integer.toString((int)input.charAt(i)).length());
      }
      return ret;
  }
}

入力(inp)に対して、shiftとshift2の関数を適用して、結果が"inagzgkpm)Wl&Tg&io"と等しいか確認していることがわかる。shiftとshift2は文字コードをずらしているだけなので、逆を行うようにするとフラグを得られる。

import java.util.*;
public class Main {
  public static void main(String[] args) throws Exception {
      String inp = "inagzgkpm)Wl&Tg&io";
      inp = shift_rev(shift2_rev(inp));
      System.out.println(inp);
  }
  
  public static String shift_rev(String input) {
      String ret = "";
      for (int i = 0; i<input.length(); i++) {
          ret+=(char)(input.charAt(i)+i);
      }
      return ret;
  }
  public static String shift2_rev(String input) {
      String ret = "";
      for (int i = 0; i<input.length(); i++) {
          ret+=(char)(input.charAt(i)-Integer.toString((int)input.charAt(i)).length());
      }
      return ret;
  }
}

Flag: flag{intr0_t0_r3v}

* AP Lab: English Language

The AP English Language activity will ask you to reverse a program about manipulating strings and arrays. Again, an output will be given where you have to reconstruct an input.

Author: AC

今回のプログラムは以下の通りである。

i
mport java.util.Scanner;
public class EnglishLanguage
{
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       String inp = sc.nextLine();
       if (inp.length()!=23) {
           System.out.println("Your input is incorrect.");
           System.exit(0);
       }
       for (int i = 0; i<3; i++) {
           inp=transpose(inp);
           inp=xor(inp);
       }
       if (inp.equals("1dd3|y_3tttb5g`q]^dhn3j")) {
           System.out.println("Correct. Your input is the flag.");
       }
       else {
           System.out.println("Your input is incorrect.");
       }
   }
   public static String transpose(String input) {
       int[] transpose = {11,18,15,19,8,17,5,2,12,6,21,0,22,7,13,14,4,16,20,1,3,10,9};
       String ret = "";
       for (int i: transpose) {
           ret+=input.charAt(i);
       }
       return ret;
   }
   public static String xor(String input) {
       int[] xor = {4,1,3,1,2,1,3,0,1,4,3,1,2,0,1,4,1,2,3,2,1,0,3};
       String ret = "";
       for (int i = 0; i<input.length(); i++) {
           ret+=(char)(input.charAt(i)^xor[i]) ;
       }
       return ret;
   }
}

上と同じように入力(inp)にtransposeとxorを3回適用して、結果が"1dd3|y_3tttb5g`q]^dhn3j"と等しいか確認している。transposeは配列の順番を入れ替えているだけ、xorは再度xorをかけるともとに戻ることを利用して逆算すると、フラグを得られる。

import java.util.*;

public class Main {
   public static void main(String[] args) throws Exception {   
       String inp = "1dd3|y_3tttb5g`q]^dhn3j";
       for (int i = 0; i<3; i++) {
           inp=xor(inp);
           inp=transpose_rev(inp);
       }
       System.out.println(inp);
  }
  
  public static String transpose_rev(String input) {
      //int[] transpose = {11,18,15,19,8,17,5,2,12,6,21,0,22,7,13,14,4,16,20,1,3,10,9};
      int[] transpose_rev = {11,19,7,20,16,6,9,13,4,22,21,0,8,14,15,2,17,5,1,3,18,10,12};
      String ret = "";
      for (int i: transpose_rev) {
          ret+=input.charAt(i);
      }
      return ret;
  }
  
  public static String xor(String input) {
      int[] xor = {4,1,3,1,2,1,3,0,1,4,3,1,2,0,1,4,1,2,3,2,1,0,3};
      String ret = "";
      for (int i = 0; i<input.length(); i++) {
          ret+=(char)(input.charAt(i)^xor[i]) ;
      }
      return ret;
  }
}

Flag: flag{n0t_t00_b4d_r1ght}

* Recursion Reverse

Jimmy needs some help figuring out how computers process text, help him out!

Author: AD

今回のプログラムは以下です。

import java.util.Scanner;
public class AscII {
	static int num = 0;
	
	public static void main(String[] args) {
		 Scanner sc = new Scanner(System.in);
		 System.out.print("Enter your  guess: ");
		 String guess = sc.nextLine();
		 
		 if (guess.length()!= 12) 
			 System.out.println("Sorry, thats wrong.");
		 else {
			 if(flagTransformed(guess).equals("I$N]=6YiVwC")) 
				 System.out.println("Yup the flag is flag{" + guess + "}");			 
			 else 
				 System.out.println("nope"); 
		 }
	}
	
	public static String flagTransformed(String guess) {
		char[] transformed = new char[12];
		
		for(int i = 0; i < 12; i++) {
			num = 1;
			transformed[i] = (char)(((int)guess.charAt(i) + pickNum(i + 1)) % 127);	
		}
		
		char[] temp = new char[12];		
		for(int i = 11; i >= 0; i--) 
			temp[11-i] = transformed[i];
			
		return new String(temp);	
	}
	
	private static int pickNum(int i) {
		
		for(int x = 0; x <= i; x++)
			num+=x;
		
		if(num % 2 == 0)
			return num;
		else 
			num = pickNum(num);
		
		return num;		
	}	 
}

同じように逆の演算をするとフラグを得られらます。

import java.util.*;

public class Main {
   
   static int num = 0;
   
   public static void main(String[] args) {
		 String guess = "I$N]=6YiVwC";
		 guess = flagTransformed(guess);
		 System.out.println(guess);
	}
   
   public static String flagTransformed(String guess) {

		char[] temp = new char[12];		
		for(int i = 11; i >= 0; i--) 
			temp[11-i] = guess.charAt(i);
		
		char[] transformed = new char[12];		
		for(int i = 0; i < 12; i++) {
			num = 1;
			int j = 0;
			int pick =  pickNum(i + 1);
			while(true) {
			    int k = j*127 + (int)temp[i] - pick;
			    if(k > 0){
			        transformed[i] = (char)k;
			        break;
			    } 
			    j++;
			}
		}
			
		return new String(transformed);	
	}
	
	private static int pickNum(int i) {
		
		for(int x = 0; x <= i; x++)
			num+=x;
		
		if(num % 2 == 0)
			return num;
		else 
			num = pickNum(num);
		
		return num;		
	}
}

Flag: flag{AscII is key}

---------- Binary Exploitation ----------

* Intro to Netcat 2: Electric Boogaloo

Intro to Netcat was too difficult, seeing as 32% of teams failed to solve it.
To get the flag, install Netcat.
nc pwn.hsctf.com 5001

Author: meow
$ nc pwn.hsctf.com 5001
Hey, here's your flag! flag{https://youtu.be/-TVWst0YqCI}

Flag: flag{https://youtu.be/-TVWst0YqCI}

---------- Forensics ----------

* Comments

I found this file on my Keith's computer... what could be inside?

Author: AC
Hint: Look through the comments :eyes:
Hint: http://kb.winzip.com/help/winzip/help_comment.htm

Command.zipというファイルをダウンロードできる。解凍すると1.zipができ、1.zipを解凍すると2.zipができるのを繰り返し、8.zipを解凍するとflag.txtが手に入るが、「No flag here. :(」とテキストがあるだけでフラグは手に入らない。

ヒントにあるようにコメントが鍵のようなので、zipinfoコマンドを使って情報を表示する。

$ zipinfo -v Comments.zip 
Archive:  Comments.zip
There is no zipfile comment.

End-of-central-directory record:
-------------------------------

 Zip archive file size:                      1471 (00000000000005BFh)
 Actual end-cent-dir record offset:          1449 (00000000000005A9h)
 Expected end-cent-dir record offset:        1449 (00000000000005A9h)
 (based on the length of the central directory and its expected offset)

 This zipfile constitutes the sole disk of a single-part archive; its
 central directory contains 1 entry.
 The central directory is 76 (000000000000004Ch) bytes long,
 and its (expected) offset in bytes from the beginning of the zipfile
 is 1373 (000000000000055Dh).


Central directory entry #1:
---------------------------

 1.zip

 offset of local header from start of archive:   0
                                                 (0000000000000000h) bytes
 file system or operating system of origin:      Unix
 version of encoding software:                   3.0
 minimum file system compatibility required:     MS-DOS, OS/2 or NT FAT
 minimum software version required to extract:   1.0
 compression method:                             none (stored)
 file security status:                           not encrypted
 extended local header:                          no
 file last modified on (DOS date/time):          2020 May 25 13:17:54
 file last modified on (UT extra field modtime): 2020 May 26 02:17:53 local
 file last modified on (UT extra field modtime): 2020 May 25 17:17:53 UTC
 32-bit CRC value (hex):                         2e050a96
 compressed size:                                1310 bytes
 uncompressed size:                              1310 bytes
 length of filename:                             5 characters
 length of extra field:                          24 bytes
 length of file comment:                         1 characters
 disk number on which file begins:               disk 1
 apparent file type:                             binary
 Unix file attributes (100777 octal):            -rwxrwxrwx
 MS-DOS file attributes (00 hex):                none

 The central-directory extra field contains:
 - A subfield with ID 0x5455 (universal time) and 5 data bytes.
   The local extra field has UTC/GMT modification/access times.
 - A subfield with ID 0x7875 (Unix UID/GID (any size)) and 11 data bytes:
   01 04 e8 03 00 00 04 e8 03 00 00.

------------------------- file comment begins ----------------------------
f
-------------------------- file comment ends -----------------------------

同様に、1.zip等の情報も確認して、繋げるとフラグとなる。

Flag: flag{4n6}

---------- Algorithms ----------

* Pythagorean Tree Fractal 1

Please see the attached file for more details (and ignore the red dots on the images).

Author: Plate_of_Sunshine

スクリーンショット 2020-06-02 13.34.09

Stageが1あがるごとに正方形の一辺に2つの正方形が追加されていくフラクタル図形に関する問題である。Stage 50のときの正方形の数がフラグである。

Stage nだと正方形方形の数は2^n-1となるので、答えは2^50-1となる。

Flag: flag{1125899906842623)

* Pythagorean Tree Fractal 2

Pythagorean Tree 2
Because every good thing must have a sequel ;)
Please see the attached file for more details (and ignore the red dots on the images).
Note: Don't worry about overlapping squares!

Author: Plate_of_Sunshine

スクリーンショット 2020-06-02 17.38.17

Stage 1の面積が70368744177664のとき、Stage 25では面積はいくつになるかという問題である。計算すると、Stage 2では面積は2倍、Stage 3では面積は3倍になることがわかるので、Stage 25では70368744177664 * 25となり、フラグを得られる。

Flag: flag{1759218604441600}

----------- Forensics ----------

* Meta Mountains

It seems that mountains are a great place for hiding secrets. Maybe you could find this one!

Author: wooshi

画像5

Stringsコマンドで可読部分を表示させると、3パートにわかれたフラグが見つかる。

$ strings mountains_hsctf.jpg -n 10      
part 1/3: flag{h1dd3n_w1th1n_
part 2/3: th3_m0unta1ns_
2012:02:03 11:18:05
part 3/3: l13s_th3_m3tadata}
...

おそらく本来はExifのメタデータを確認するのが狙いだと思うので、EXIF確認くんで情報を見ても同じくフラグが見つかる。

スクリーンショット 2020-06-02 15.41.34

Flag: flag{h1dd3n_w1th1n_th3_m0unta1ns_l13s_th3_m3tadata}

---------- Web Exploitation ----------

* Blurry Eyes

I can't see :(
https://blurry-eyes.web.hsctf.com
Author: meow

指定されたページにアクセスすると、フラグが書かれているであろう部分は隠されていて見えないようになっている。

スクリーンショット 2020-06-02 13.54.58

ページのソースを確認すると、CSSでスタイルを変更していることがわかる。

スクリーンショット 2020-06-02 13.55.45

CSSファイルを確認すると、フラグがわかる。

スクリーンショット 2020-06-02 13.56.52

Flag: flag{glasses_are_useful}

* Inspector Gadget

https://inspector-gadget.web.hsctf.com/

Author: Madeleine

アクセスしてソースを見るとそのまま書いてある。

スクリーンショット 2020-06-02 17.48.47

Flag: flag{n1ce_j0b_0p3n1nG_th3_1nsp3ct0r_g4dg3t}

* Very Safe Login

Bet you can't log in.
https://very-safe-login.web.hsctf.com/very-safe-login

Author: Madeleine

webページにアクセスすると、ユーザー名とパスワードを求められる。

スクリーンショット 2020-06-04 13.40.44

ページのソースを確認すると、スクリプトにユーザー名とパスワードがの条件式があるので、​これらを入力するとフラグが手に入る。

スクリーンショット 2020-06-04 13.42.44

Flag: flag{cl13nt_51de_5uck5_135313531}

---------- Milestones -----------

* Does CTFd Work?

Does the Catch The Flag daemon work? Here's the flag: flag{y3S_i7_d03s_3xcl4m4710n_m4rk_890d9a0b}

Flag: flag{y3S_i7_d03s_3xcl4m4710n_m4rk_890d9a0b}

* Discord Flag

Join the HSCTF Discord: https://discord.gg/vU7tFKx

Flag: flag{good_luck_have_fun}


この記事が気に入ったらサポートをしてみませんか?