cakectf 2022 smal aray
1 |
|
以上のコードが動いてます。初めにsizeを決めて、その後にindex・valueを決めていきます。
sizeは5までしか入れられません。しかし、これらのメモリはcallocaによりheap上ではなく、stack上にメモリ確保されます。以下はsizeに5を、indexを4入れている状況です。
1 | 00:0000│ rsp 0x7ffc7ece5fd0 —▸ 0x7ffc7ece6138 —▸ 0x7ffc7ece7d8c ◂— 0x6c6c6168632f2e /* './chall' */ |
よって、indexがsizeの配置場所と被ることがわかるので、これを使ってsizeを大きくすることでstackに任意書き込みできるようにしていきます。具体的にはsizeを5、indexを4、valueを0xffffffffです。
これによりstackに対する任意書き込みが成立します。
一方でindexの計算は6番目に配置されているアドレスを基に計算されている=それも変えることでAAWができますが、stackに対する書き込みは基本的にできなくなります。
というわけで、一回のAAW使ってlibc leakを行っていきます。具体的なlibcはgot overwriteとropでやっていきます。
rop chainはpop_rdi_ret -> printf_got -> call print -> main+8で想定しています。got overwriteはexitにstack調整用のpop r15 retにしています。
この時、戻り先は色々ありますが、この先もropでshellを得たいので、stackに書き込めるようにmain+8にもどるようにしています。
これでlibc leakができたのでshellを取っていきます。この時に、先ほどのsizeのoverwriteはできないので5つの部品を使ってropを組んでいきます。このropは簡単で、pop rdi ret-> /bin/shのアドレス->systemのアドレスで終わりです。
1 | """ |