uaf4b
sol
use after freeの簡易な勉強
mainのループ前にcowsay
がmalloc
で確保されている。また、cowsay
の構造体は以下の通りです。
1 | cowsay = (COWSAY*)malloc(sizeof(COWSAY)); |
1 | typedef struct { |
このmallocで確保される領域は、4*8bytesになるらしい。←(なぜ?? void (*fn_dialogue)(char*)
, char
それぞれのアドレスの値で8*2bytesなのは納得)
この問題の挙動は、
system
のアドレスが与えられる- 以下のことが実行可能
fn_dialogue
にあるアドレスに対してmessageを引数にして関数を呼び出しmessage
の変更(message自体はmallocで確保しているためアドレスが入っている)cowsay
のfree
を行う- heap領域の閲覧(debug目的)
なので、やることとしてはsystem
のアドレスをfn_dialogue
、messageに/bin/sh
を入れて適当にshellを呼び出せばいいです。
では、fn_dialogue
を書き換えるのかが問題になってきます…
答えとしては、free
でどうこうします。free関数の挙動はあんこさんが書いてくれているので、ここでは必要かつ基本的な挙動だけ…
free関数が呼ばれるとそのメモリは解放され、tcache(再度heapで使えるような領域?)となります。
注意が必要なのはそのメモリが解放されるだけで、変数に入っているそのアドレスには何も変化が起きない
→解放した領域を再度確保し値を書き込むと、もともと変数に入っていたアドレスを自由に操作できる可能性がある
なるほど、、、
今回は、cowsay
をfreeしてmessageのmallocで確保するとtcacheにある領域がしてが使われ、fn_dialogue
の値を書き換えることができる。
1 | from ptrlib import * |