適当にLTネタになるかな,と思って作った話. https://github.com/Drumato/ebpf-disasm
eBPF disassemblerを作るDrumato
View Slide
Attention!● 完全準拠ではない● torvalds/linux/samples/bpfのkernel side sourceがそれっぽくなればOKまでをやった
背景
なんとなくeBPFについての記事を読んでた
"基本的に命令長は64bit固定"という記述を見る
素敵!disasm書きたい!(x64を想いつつ)
書く
身につける必要があった知識● Object file上でeBPF functionがどのように表現されているか● Opcode encoding/immediateの形式を知る
あとは頑張って書く
これはassembler自作と大して変わらない
ELF Header
eBPF object file#ELF Header
E_machine以外は普通のrelocに見える
Section Header Table
eBPF object file#SHT
eBPF object file#SHT.textはあるけど中身は空
eBPF object file#SHTSEC("socket1")のように書いたsymbolがsectionに
eBPF object file#SHTeBPF mapsもsectionにEntry sizeはProgramで決まっていて,Shdr.sh_entsizeを読んでもわからないKey + valueのどちらも可変なのでentsizeは使えないか(linkとinfoは?)
eBPF object file#SHTこれは単に"GPL\0"という文字列が入っているだけ
Symbol table
eBPF object file#symtab
ぱっと見特に気になる点はなし
eBPF object file#summary● なんとなく以下を満たすsectionをdisasすれば良さそう○ Shdr.sh_type == SHT_PROGBITS○ Shdr.sh_flags & (SHF_ALLOC | SHF_EXECINSTR) != 0○ Shdr.sh_size > 0
eBPF instruction architecture
eBPF instruction architecture#overview
eBPF instruction architecture#overviewOpcodeEncodinghead byteをどう解釈するか
eBPF instruction architecture#overviewInstructionClassOpcodeをどう解釈するかEx1.ic=0x04ならopcode=0x00はAddic=0x05ならopcode=0x00はJA
eBPF instruction formatArithOrJumpMemory
eBPF instruction formatArithOrJumpMemoryADD/SUB/MUL/DIV/MOD/LSH etc..JA/JEQ/JGT/JSLT/ etc...
eBPF instruction formatArithOrJumpMemoryUse src field as registerIf S bit is up
eBPF instruction formatArithOrJumpMemoryALU/ALU64/JMP/JMP64
eBPF instruction formatArithOrJumpMemoryIMM/MEM/IND/ABS etc
eBPF instruction formatArithOrJumpMemoryByte/Half word/Word/Double Word
eBPF instruction formatArithOrJumpMemoryLD/LDX/ST/STX
わかったら書く!書く!
機械語programmingは手動かす!
disasm#tips● Building block的に作ると良い○ Opcode type/InstClass typeを作ってEncoding typeを作る■ それぞれのdecoderを書く○ それら(とsrc/dst/offset/imm)をまとめてInstruction typeを作る■ decoderを次々呼ぶだけ● srcは ooooxxxx のようになっているけど,4bit rshすると使いやすい○ Register numberに変換する感覚
disasm#summary
このくらいのしょぼ完成度ならサクッと数時間で作れる
references● Linux Socket Filtering aka Berkeley Packet Filter (BPF) - www.kernel.org● Drumato/ebpf-disasm … 実装○ 完全じゃないよ(Memory InstClassは適当)
Thanks!