RGB CTF 2020 Writeup
Contents
URL: https://ctf.rgbsec.xyz/home
最終順位は、334位でした。
こうやってみると、全然解けてないですね。。
[Beginner]: Pieces
Challenge
My flag has been divided into pieces :( Can you recover it for me?
Attachment:
- Main.java
以下が中身です。
|
|
Solution
Javaのコードの中でやっていることは、
- 文字を2で割ったものをansに追加。(16行目)
- 文字を2で割り切れた場合はansに"|“を追加、割り切れなければansに”/“を追加。(17行目)
- その結果が
9|2/9/:|4/7|8|4/2/1/2/9/になる。(6行目)
ということで、
$ python3
>>> chr((ord('9'))*2)
'r'
>>> chr((ord('2'))*2+1)
'e'
>>> chr((ord('9'))*2+1)
's'
>>> chr((ord(':'))*2)
't'
>>> chr((ord('4'))*2+1)
'i'
>>> chr((ord('7'))*2)
'n'
>>> chr((ord('8'))*2)
'p'
>>> chr((ord('4'))*2+1)
'i'
>>> chr((ord('2'))*2+1)
'e'
>>> chr((ord('1'))*2+1)
'c'
>>> chr((ord('2'))*2+1)
'e'
>>> chr((ord('9'))*2+1)
's'
Flag: rgbCTF{restinpieces}
[Misc]: Differences
Challenge
If a difference could difference differences from differences to calculate differences, would the difference differently difference differences to difference the difference from different differences differencing?
Attachment:
- DifferenceTest.java
Solution
所々、文字化けしてます。
やることは簡単で、バイナリエディタで値を取得し、本来の文字との値の差分を取るとフラグになる、というだけです。
最初の7文字は、rgbCTF{ なので、以下は8文字目以降です。
文字化けしている箇所のHex値は以下の通り。(8文字目以降)
E7, D5, 9F, DE, D1, A6, D3, E1, A1, A2, E2, 9F, C1, D7, 7D
本来、入るべきの文字は以下の通り。(8文字目以降)
's', 'c', 'n', 'n', 'e', 's', 't', 't', 'n', 'n', 't', 'n', 'S', 'p', '}'
ということで、
$ python3
>>> chr(0xE7-ord('s'))
't'
>>> chr(0xD5-ord('c'))
'r'
>>> chr(0x9F-ord('n'))
'1'
>>> chr(0xDE-ord('n'))
'p'
>>> chr(0xD1-ord('e'))
'l'
>>> chr(0xA6-ord('s'))
'3'
>>> chr(0xD3-ord('t'))
'_'
>>> chr(0xE1-ord('t'))
'm'
>>> chr(0xA1-ord('n'))
'3'
>>> chr(0xA2-ord('n'))
'4'
>>> chr(0xE2-ord('t'))
'n'
>>> chr(0x9F-ord('n'))
'1'
>>> chr(0xC1-ord('S'))
'n'
>>> chr(0xD7-ord('p'))
'g'
>>> chr(0x7D-ord('}'))
'\x00'
Flag: rgbCTF{tr1pl3_m34n1ng}
Triple Meaning (どこがトリプル?)
[Pwn/Rev]: Too Slow
Challenge
I’ve made this flag decryptor! It’s super secure, but it runs a little slow.
Attachment:
- a.out
Solution
Ghidraでデコンパイルします。
|
|
main() を見ると、getKey() の戻り値を win() の引数にして呼んでいるのがわかります。
getKey() では、local_10 が 0x265d1d23 になるまで特定の計算をしつつループします。これが時間かかります。
local_10 は 1 ずつインクリメントしているだけなので、戻り値は計算するまでもなく 0x265d1d23 になります。
よって、単純に win() に 0x265d1d23 を渡してやるとフラグが取れます。
gdbを使って解きました。
|
|
Flag: rgbCTF{pr3d1ct4bl3_k3y_n33d5_no_w41t_cab79d}
[Beginner]: Shoob
Challenge
s h o o b
Attachment:
- shoob.png
### (Unsolved) 「青い空を見上げればいつもそこに白い猫」の「左ローテート 7回」が一番見やすかったです。
ただし、字がちゃんと読めなくて、フラグが通りませんでした。。。めんどくさくなって、降参。
Author CaptureAmerica @ CTF フラxxグゲット
LastMod 2020-07-14