ミスっぽいのを見つけたら教えてください
0x7f, 0x45, 0x4c, 0x46
0x1020
SHT_DYNSYM
(A) 4 つ
(B)
- 0x0
- 0x1000
- 0x2000
- 0x3e00
(A) 5 つ
(B)
- data_start
- __data_start
- _start
- __bss_start
- _init
終了コード 4 で終了する
- 少しでもELFに対する理解を深めて欲しいという思いがまずあった
- manpageとelf.hを読んでほしかった
- とりあえず以下のような流れで問題を作ることにした
- ヘッダさえ見ればわかる問題
- ヘッダから得られる情報をもとに以降をパースすればわかる問題
- ヘッダ情報とパースに加え、経験則が求められる可能性のある問題
- 人間CPU(???)
- 0問目:マジックナンバーを回答する問題は、他の受講生の助言によって加えたもの
- 個人的にはヘッダさえ見ればOK問題はこの次の問題で十分だと思っていたが、見た感じこの問題しか解けていない人も居て、結果としては追記しておいてよかったという感じ
- 1問目:ヘッダの中でもどの情報を回答させるか迷ったが、エントリーポイントがわりとよさそうかなと思った
- enum(例えばOSABIはこれ)ではなく、普通に数字を読んでほしかった
- ヘッダの先頭から一番近い数字だったというのもある
- 2問目:次の問題でセグメントに関する問題を出すことを決めていたため、ここではセクションについて回答させることにした
- ベタなSHT_PROGBITSで良いのではと思ったが、ここは裏をかいておこうかと思って、なんとなく良さげな動的リンクシンボルにした
- 8番目というのはちょっとデカすぎだったかも
- 3問目:ローダというからにはやっぱりLOADセグメントでしょ
- この競技のアイデアと同時に思い浮かんだ問題で、その時に考えていた問題分からほとんど変わっていない
- 個人的には、人間に解けるELF人力パース問題としてはこの問題までを想定していた
- 4問目:セクションヘッダを見るだけでは駄目な問題を作ろうと思い、シンボル名とか良さそうじゃねというぼんやりしたアイデアから作問
- 今思うと、シンボル数多すぎでは……?(23個)全て列挙してからtで終わるシンボルを抽出させるのアホほど時間かかるでしょ
- 5問目:これもう人間ローダじゃなくて人間CPUだろという気持ちが問題文にも表れている
このバイナリは以下のCソースコードを clang -O0 main.c
でビルドした結果です(clang 15.0.7, target: x86_64-pc-linux-gnu)
int main(void) {
return 1 << 2;
}
仮に人間CPUに取り組む人が居るなら、機械語を読むときにただretするだけのものではなく、何かしらの数値演算を気持ち程度加えたものであるほうが面白いのではないか、と考えていたことが伺えますね
余談:
- 最初はRust製のバイナリを用いた大問2つ構成にしようと思っていたものの、Rustのバイナリがあまりにもデカすぎたのでやめた
readelf
対策として、hexyl
の結果を印刷して紙媒体にしてしまえば良いのでは?というアイデアを聞いてなるほど〜!と思ったけど、実際にやってみると一人あたり10枚くらい印刷しなければならないことが判明し、断念した- アセンブリ書いてELF生成したほうがまだ人間にやさしいバイナリになったのでは……?
- 問題が完成したのは深夜3時で、さすがに問題を実際に解いて検証するのを諦める他なかった
- 僕はこの想定解の作成に
readelf
を使いました コンピューターってサイコ〜〜