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 | """ |