picoCTF – FactCheck より。
allocator (malloc/free 等に頼らない高レベルのメモリ管理) を使って heap 内の変数にフラグを構築している。
途中でコンストラクタで破棄されるので、main の最後まで行って確認しようとしても見えない。
よく探すと ghidra で最後の “}” を繋げる CALL が確認できるので、GDB でその直後まで行き、そこで heap 領域から読み取ればよい。
heap 領域の探し方は、最後の CALL 直後の RAX を参照するか、find で探す。
まずは直後の heap 領域までいく。
- ghidra の decompile を見て、GDB 上の対応するブレークポイントを確認する。ghidra では main の始まりのアドレスが 0x00101289 に対し GDB では 0x555555555289 であった。ghidra の “}” 連結の CALL は 0x00101860 だったので GDB では 0x555555555860 となる。
- break 0x555555555860 (あるいは break *main + 1495)
- run
解法① : RAX の参照
- x/8x $rax
- x/s 0x55555556aed0
解法② : find で探す
- info proc mappings で heap 領域を確認
- find 0x555555559000,0x555555557a00-1,char[4]”pico”
- x/s 0x55555556aed0