見出し画像

TJCTF 2020 write-up

5/22 19:00〜5/26 19:00(EDT)に開催されたTJCTFにソロで参加しました。解けた問題のwrite-upを以下に示します。

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

* A First Step [5 points]

Written by boomo

Every journey has to start somewhere -- this one starts here (probably).
The first flag is tjctf{so0p3r_d0oper_5ecr3t}. Submit it to get your first points!

Flag: tjctf{so0p3r_d0oper_5ecr3t}

* Discord [5 points]

Written by KyleForkBomb

Strife, conflict, friction, hostility, disagreement. Come chat with us! We'll be sending out announcements and other important information, and maybe even a flag!

Discordに参加してチャンネルを眺めるとフラグが見つかる。

Flag: tjctf{we_love_wumpus}

----------- Web ----------

* Broken Button [10 points]

Written by saisree

This site is telling me all I need to do is click a button to find the flag! Is it really that easy?

siteに設置されているボタンを押しても動かない。ソースを確認してリンク先を見ればフラグが得られる。

キャプチャ

Flag: tjctf{wHa1_A_Gr8_1nsp3ct0r!}

* Login [30 points]

Written by saisree

Could you login into this very secure site? Best of luck!

すごいセキュアなサイトにアクセスすると、UsernameとPasswordを入力できるページが確認できる。

スクリーンショット 2020-05-25 9.19.33

ページのソースでJavascript部分を確認し、整形すると以下のようになっている。

var _0xb31c = ['value', 'c2a094f7d35f2299b414b6a1b3bd595a',
	'Sorry. Wrong username or password.', 'admin', 'tjctf{', 'getElementsByName',
	'toString'
];
(function(_0xcd8e51, _0x31ce84) {
	var _0x55c419 = function(_0x56392e) {
		while (--_0x56392e) {
			_0xcd8e51['push'](_0xcd8e51['shift']());
		}
	};
	_0x55c419(++_0x31ce84);
}(_0xb31c, 0x1e7));
var _0x4a84 = function(_0xcd8e51, _0x31ce84) {
	_0xcd8e51 = _0xcd8e51 - 0x0;
	var _0x55c419 = _0xb31c[_0xcd8e51];
	return _0x55c419;
};
checkUsername = function() {
	username = document[_0x4a84('0x1')]('username')[0x0]['value'];
	password = document[_0x4a84('0x1')]('password')[0x0][_0x4a84('0x3')];
	temp = md5(password)[_0x4a84('0x2')]();
	if (username == _0x4a84('0x6') && temp == _0x4a84('0x4')) alert(_0x4a84('0x0') +
		password + '890898}');
	else alert(_0x4a84('0x5'));
};

checkUsernameでusernameとpasswordを確認しているが、usernameは_0x4a84('0x06') = adminと一致しているか、tempはpasswordをmd5で暗号した結果がc2a094f7d35f2299b414b6a1b3bd595aと一致しているか確認しているようだ。

md5はMD5Onlineで探すとDecryptでき、inevitableであることがわかる。

以上から、usernameをadmin、パスワードをinevitableとしてブラウザに入力すると、フラグを得られる。

Flag: tjctf{inevitable890898}

----------- Cryptography ----------

* Speedrunner [10 points]

Written by boomo

I want to make it into the hall of fame -- a top runner in "The History of American Dad Speedrunning". But to do that, I'll need to be faster. I found some weird parts in the American Dad source code. I think it might help me become the best.

暗号文は以下の通り。

LJW HXD YUNJBN WXC DBN CQN CNAV "FXAUM ANLXAM'? RC'B ENAH VRBUNJMRWP JWM JBBDVNB CQJC CQN ERMNX YXBCNM RB CQN OJBCNBC CRVN, FQNAN RW OJLC BXVNXWN NUBN LXDUM QJEN J OJBCNA, DWANLXAMNM ENABRXW. LXDUM HXD YUNJBN DBN CQN CNAV KTCFENJJJEKVXOBAL (KNBC TWXFW CRVN FRCQ ERMNX NERMNWLN JB JYYAXENM JWM ENARORNM KH VNVKNAB XO CQN BYNNM ADWWRWP LXVVDWRCH) RW CQN ODCDAN. CQRB FXDUM QNUY UXFNA LXWODBRXW RW CQNBN CHYNB XO ERMNXB RW ANPJAM CX CQN NENA DYMJCRWP JWM NEXUERWP WJCDAN XO CQN BYNNMADWWRWP LXVVDWRCH.

CSLCO{WNF_CNLQ_WNF_CNLQ_PX_OJBC_PX_OJBC}

シーザー暗号だと思ってCyberchefで変換したら正解だった。

Flag: TJCTF{NEW_TECH_NEW_TECH_GO_FAST_GO_FAST}

* Typewriter [30 points]

Written by jpes707

Oh no! I thought I typed down the correct flag for this problem on my typewriter, but it came out all jumbled on the paper. Someone must have switched the inner hammers around! According to the paper, the flag is zpezy{ktr_gkqfut_hxkhst_tyukokkgotyt_hoftqhhst_ykxoz_qxilrtxiyf}.
Hint
a becomes q, b becomes w, c becomes e, f becomes y, j becomes p, t becomes z, and z becomes m. Do you see the pattern?

aがq, bがw, cがeになっていることと、タイトルのタイプライターから推定した。キーボードのqwertyがabcdefの順になっていることに気づくとフラグを得られる。Pythonでデコードするプログラムは以下の通り。

s = "zpezy{ktr_gkqfut_hxkhst_tyukokkgotyt_hoftqhhst_ykxoz_qxilrtxiyf}"

c = "qwertyuiopasdfghjklzxcvbnm"
p = "abcdefghijklmnopqrstuvwxyz"

for i in s:
   if c.find(i) != -1:
       print(p[c.find(i)], end="")
   else:
       print(i, end="")

Flag: tjctf{red_orange_purple_efgrirroiefe_pineapple_fruit_auhsdeuhfn}

---------- Reversing ----------

* Forwarding [10 points]

Written by KyleForkBomb

It can't be that hard... right?
forwarding

stringsで可読部分を表示すればフラグをゲットできる。

$ strings d9c4527bc1d5c58c1192f00f2e2ff68f84c345fd2522aeee63a0916897197a7a_forwarding | grep tjctf
tjctf{just_g3tt1n9_st4rt3d}

Flag: tjctf{just_g3tt1n9_st4rt3d}

* Gym [20 points]

Written by agcdragon

Aneesh wants to acquire a summer bod for beach week, but time is running out. Can you help him create a plan to attain his goal?
nc p1.tjctf.org 8008

与えられたプログラムを実行すると、211lbs(ポンド)の体重を正確に180lbsにするように求められる。アクティビティは1〜4まであって、7日間それぞれのアクティビティを選択し、目標を達成すればフラグが得られるようである。つまり31lbs減らせばいいということである。

$ ./bed9d7b7327958dab4d07b06772a032f3e97455e310956558579e8838762b5e2_gym 
I'm currently 211 lbs. Can I be exactly 180? Help me out!
-------------------------
Today is day 1.

Choose an activity:
[1] Eat healthy
[2] Do 50 push-ups
[3] Go for a run.
[4] Sleep 8 hours.

ソースコードをGhidraでデコンパイルした一部は以下のようになっている。

スクリーンショット 2020-05-27 14.27.18

 [1]を選ぶとeat_healthyが呼ばれる。eat_healtyをデコンパイルした結果を見ると、4を返すことがわかる。同様に、[2]のdo_pushupは1、[3]のgo_runは2、[4]のgo_sleepは3を返すので、体重がそれぞれ返された値だけ減ることがわかる。

ただし、[3]のgo_runを選んだときは、go_sleepも呼ばれるので、体重は2+3の5lbs減ることに注意する必要がある。

以上を踏まえて31lbs減らすためには 、5 * 6 + 1とすればよいので、[3]を5回、[2]を1回実施すればよい。

Flag: tjctf{w3iGht_l055_i5_d1ff1CuLt}

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