breakRAID

ファイル breakRAID.tar.gz が与えられた。
これを展開すると、ファイル disk00disk01disk02 が得られた。

disk00 は、全部のバイトが0x00だった。
disk01stringsコマンドをかけると、IHDRなどのPNGのチャンク名が出てきた。
disk02stringsコマンドをかけると、PNGのチャンク名に加え、01.png18.png のファイル名と思われる文字列が出てきた。

ファイルが3個あるということは、使われているディスクが3台であることを表していると予想できる。
とりあえず、以下を参照してRAIDの種類の特定を試みた。

A file breakRAID.tar.gz was given.
Files disk00, disk01, and disk02 are extracted from this file.

All bytes of disk00 were 0x00.
Applying the strings command to disk01 yielded PNG chunk names like IHDR.
Applying the strings command to disk01 yielded not only PNG chunk names but also strings from 01.png to 18.png that look like names of files.

I guessed that having 3 files means that 3 disks are used.
To begin with, I tried to determine which kind of RAID is used referring this:

RAID - Wikipedia

RAID 0 は、耐障害性が無いため今回の問題には適さなそうである。
RAID 1 は複数のディスクに同じ内容を書き込むが、今回はdisk01disk02の内容が異なるので適さなそうである。
RAID 2 は最低5台のディスクを必要とするが、今回は3台しか無いので適さなそうである。
RAID 3、RAID 4、RAID 5 は3台のディスクで構築でき、今回の条件と矛盾しなそうである。
RAID 6 は最低4台のディスクを必要とするが、今回は3台しか無いので適さなそうである。

したがって、今回使われているのは RAID 3、RAID 4、RAID 5 のどれかであると考えられる。
これらの方式ではXORを用いるようなので、とりあえず以下のプログラムで disk01disk02 のXORをとり、disk-xored とした。

RAID 0 doesn't look good for this challenge because it has no fault tolerance.
RAID 1 doesn't fit because it should write the same data to multiple disks while data in disk01 and disk02 differ.
RAID 2 doesn't fit because it requires at least 5 disks while there are only 3.
RAID 3, RAID 4, RAID 5 can be constructed using 3 disks and it looks good for this challenge.
RAID 6 doesn't fit becaseu it requires at least 4 disks while there are only 3.

In conclusion, one of RAID 3, RAID 4, or RAID 5 should be used in this challenge.
Since exclusive-or is used in these methods, so I performed exclusive-or of disk01 and disk02 using this program and saved the result to disk-xored.

xor.c

得られたファイル群からバイナリエディタで文字列 IHDR および IEND を探すと、以下の位置に見つかった。

I searched for strings IHDR and IEND from the files using a binary editor, and found at these positions:

ファイル中の IHDR および IEND の位置 The places of IHDR and IEND in the files IHDR disk01 0x0d1b00c 0x421900c 0x423b00c 0x425d00c 0x427f00c disk02 0x0d1b00c 0x422200c 0x424300c 0x426400c 0x428700c 0x42aa00c 0x42cd00c 0x610000c 0x612200c 0x614400c 0x616500c disk-xored 0x428700c 0x42aa00c 0x42cd00c 0x610700c 0x612900c 0x614b00c IEND disk01 0x0d3b8c6 0x423a994 0x425cd0b 0x427ec04 disk02 0x0d3b8c6 0x42217cb 0x4242f82 0x4263b6c 0x4286bcd 0x42a9bcd 0x42ccbcd 0x42efbdc 0x6121d5c 0x6143210 0x6164f82 disk-xored 0x4286bcd 0x42a9bcd 0x42ccbcd 0x42efbdc 0x61066fe 0x6128c97 0x614a210 0x616dbc0

同じ位置のものを除くと、IHDRIEND がそれぞれ18個ずつ見つかった。
これは、ファイル名と思われる文字列 01.png18.png に対応していそうである。

次に、以下のプログラムを用い、各ファイル中の文字列 IHDRIDATIEND の配置を調べた。

Removing occurances at the same position, I found 18 occurancees of each of IHDR and IEND.
This looks matching with the strings that looks names of files 01.png and 18.png.

After that, I used this program to see places of strings IHDR, IDAT, and IEND in each files.

list_chunk.pl

すると、画像全体が埋め込まれていそうな部分が、重複を除いて以下の16箇所あった。

As a result, I found these 16 places (duplicates are excluced) that seem the entire images are embed:

画像全体が埋め込まれていると考えられるファイル中の位置 The places in the files that look like whole image files are embed disk01 00d1b00c IHDR - 00d3b8c6 IEND 0421900c IHDR - 0423a994 IEND 0423b00c IHDR - 0425cd0b IEND 0425d00c IHDR - 0427ec04 IEND disk02 00d1b00c IHDR - 00d3b8c6 IEND 0422200c IHDR - 04242f82 IEND 0424300c IHDR - 04263b6c IEND 0426400c IHDR - 04286bcd IEND 0428700c IHDR - 042a9bcd IEND 042aa00c IHDR - 042ccbcd IEND 042cd00c IHDR - 042efbdc IEND 0610000c IHDR - 06121d5c IEND 0612200c IHDR - 06143210 IEND 0614400c IHDR - 06164f82 IEND disk-xored 0428700c IHDR - 042a9bcd IEND 042aa00c IHDR - 042ccbcd IEND 042cd00c IHDR - 042efbdc IEND 0610700c IHDR - 06128c97 IEND 0612900c IHDR - 0614a210 IEND 0614b00c IHDR - 0616dbcd IEND

また、画像の一部が埋め込まれていそうな部分が、重複を除いて以下の4箇所あった。

Also I found these 4 places (duplicates are excluced) that seem parts of image are embed:

画像の一部が埋め込まれていると考えられるファイル中の位置 The places in the files that look like parts of image files are embed disk01 0427f00c IHDR disk02 04207092 IDAT - 042217cb IEND 0616500c IHDR - 0617509e IDAT disk-xored 061050b6 IDAT - 061066fe IEND

これらを踏まえ、以下のプログラムで画像データを取り出した。 画像の一部が埋め込まれていそうな部分については、周辺を調べ、データが 00 ばかりになる手前までの部分を抽出対象とした。

Based on these findings, I used this program to extract the image data. I decided to investigate data near there and extract data before being filled up with 00 for the places with parts of images.

extract.pl

以下が、抽出対象を指定するこのプログラムの入力である。

This is the input for this program to specify what to extract:

targets.txt

抽出結果のうち 0427f00c.png04200000.png を結合して 0427f00c-04200000.png を、 0616500c.png06100000.png を結合して 0616500c-06100000.png を作成した。
その結果、以下の画像ファイル群が得られた。

I concatenated 0427f00c.png and 04200000.png to create 0427f00c-04200000.png, and concatenated 0616500c.png and 06100000.png to create 0616500c-06100000.png.
As a result, I obtained these image files:

extracted files

これで18個の画像ファイルが得られたが、順番がバラバラなようであり、 どの順番で 01.png18.png に対応しているかを調べないといけなそうである。
そこで、disk02 内の文字列 01.png の周辺を調べると、以下のように連番が並んでいた。

Now I have 18 image files, but their order looks shuffled and finding which images correspond to which of 01.png to 18.png looks required.
I investigated around the string 01.png in disk02, finding that there are some serial numbers like this:

disk02 内の文字列 01.png の周辺 Around the string 01.png in the file disk02 00515000 02 00 00 00 0c 00 01 02 2e 00 00 00 02 00 00 00 |................| 00515010 0c 00 02 02 2e 2e 00 00 0b 00 00 00 14 00 0a 02 |................| 00515020 6c 6f 73 74 2b 66 6f 75 6e 64 00 00 0c 00 00 00 |lost+found......| 00515030 10 00 06 01 30 31 2e 70 6e 67 00 00 0d 00 00 00 |....01.png......| 00515040 10 00 06 01 30 32 2e 70 6e 67 00 00 0e 00 00 00 |....02.png......| 00515050 10 00 06 01 30 33 2e 70 6e 67 00 00 0f 00 00 00 |....03.png......| 00515060 10 00 06 01 30 34 2e 70 6e 67 00 00 10 00 00 00 |....04.png......| 00515070 10 00 06 01 30 35 2e 70 6e 67 00 00 11 00 00 00 |....05.png......| 00515080 10 00 06 01 30 36 2e 70 6e 67 00 00 12 00 00 00 |....06.png......| 00515090 10 00 06 01 30 37 2e 70 6e 67 00 00 13 00 00 00 |....07.png......| 005150a0 10 00 06 01 30 38 2e 70 6e 67 00 00 14 00 00 00 |....08.png......| 005150b0 10 00 06 01 30 39 2e 70 6e 67 00 00 15 00 00 00 |....09.png......| 005150c0 10 00 06 01 31 30 2e 70 6e 67 00 00 16 00 00 00 |....10.png......| 005150d0 10 00 06 01 31 31 2e 70 6e 67 00 00 17 00 00 00 |....11.png......| 005150e0 10 00 06 01 31 32 2e 70 6e 67 00 00 18 00 00 00 |....12.png......| 005150f0 10 00 06 01 31 33 2e 70 6e 67 00 00 19 00 00 00 |....13.png......| 00515100 10 00 06 01 31 34 2e 70 6e 67 00 00 1a 00 00 00 |....14.png......| 00515110 10 00 06 01 31 35 2e 70 6e 67 00 00 1b 00 00 00 |....15.png......| 00515120 10 00 06 01 31 36 2e 70 6e 67 00 00 1c 00 00 00 |....16.png......| 00515130 10 00 06 01 31 37 2e 70 6e 67 00 00 1d 00 00 00 |....17.png......| 00515140 b8 0e 06 01 31 38 2e 70 6e 67 00 00 00 00 00 00 |¸...18.png......| 00515150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00515160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00515170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00515180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00515190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 005151a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 005151b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 005151c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 005151d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 005151e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 005151f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

そこで、disk02 から F が書かれているファイル 00d1b00c.png のサイズ 133326 (4バイト、リトルエンディアン) を検索すると、0x021d584 などに見つかった。
さらに、0x021d584 から 0x80 バイトおきに他のファイルのサイズを表すデータもあった。
ここで示されているファイルサイズの順番にファイルに書かれている文字を並べると、flagが得られた。
(同じファイルサイズのファイルもあったが、それらは書かれている文字も同じようだった)

I searched for ths size of the file 00d1b00c.png, which has the character F, 133326 (4 bytes, little endian) and it was found at 0x021d584 and some other places.
Also, there are data that represents sizes of other files from 0x021d584 at the interval of 0x80 bytes.
I obtained the flag by ordering the characters on the files according to the order of sizes recorded here.
(There are files with the same sizes, but it looked characters written there are also same.)

FLAG{ra1dr4idxxxx}

WaniCTF 2021