2.そのように修正するとファイルを開くことができるようになる理由。破損しているファイルは3つの箇所に断片化して存在するが、そのアドレスを表すphys_block_numがいずれも改竄されている。したがって、sample.rawの正しいファイルをもとに断片化したデータを探し、見つけたオフセットから3つのphys_block_numを正しい値に直せばファイルが正しくマウントされる。変更したブロックのチェックサムを正しい値に変更するため0x12d000の8バイトも修正した。3.回答に至る調査の過程(簡潔に)。破損しているファイルはIIR/iir_vol40.pdfで、中身は0x00で埋められている。hexdumpでこのファイルまで辿ってみる。問1で修正したnx_omap_oidからom_tree_oidを参照すると0x133である。このオブジェクトを見ると、btn_flagsは7で、keyを1つ持つことが分かる。Valueを見ると、ov_paddrは0x131なのでそこを辿る。apfs_omap_oidは0x12bなので、0x12b000のオブジェクトのom_tree_oidを見ると0x12cである。このBTREEを見ると、n_flagsは7でkeyは3つ存在することが分かる。0x12dであることが分かる。確認したところ3つ目の0x12dに破損したファイルが含まれることが分かるのでここを見る。n_flagsは2で、keyは0x34個存在する。iir_vol40.pdfはTOC上で22番目にあたり、対応するvalueを見ると(オフセット0x12dc9a)file_idは0x29である。idが0x29のj_inode_val_tは0x12d7d8に存在する。0x12d540に存在する。0x12d778に存在する。これらを見ると、いずれもphys_block_numが0になっている。0x9f7000であり、先程参照したj_inode_val_tからファイルサイズが0x9f6bf1であったことを考えても妥当である。0x800000である。sample.rawに含まれていた正しいiir_vol40.pdfがフラグメントしていると考え、断片化したデータをchallenge.rawから探すことでphys_block_numを修正する。iir_vol40.pdfのデータをもとに断片化したデータを探すと、それぞれ次の箇所に存在することが分かった。0x4ac3にすれば良い。オブジェクトの内容を変更したためチェックサムも変更する必要がある。これらを次のPythonスクリプトで(問1も含めて)一括して変更する。fin.close()修正したディスクダンプをapfs-fuseでマウントすると、破損していたPDFファイルが読めるようになった上、sample.rawとハッシュ値も同じになった。"gcc_challenge3_Reversing"[Answer/解答:簡潔に。print('\n'.join(disasm(code)))おわりにせっかくなら海外に行きたかった感もありますが、受かったからには東京でも全力で受講します。4のwriteupなんかtwitterで流れてたのでzer0ptsで参加しました。WriteupPwnが1問だけあったのでやりました。Writeup月別アーカイブはてなブログをはじめよう!ptr-yudaiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。