ROP
@fmirx0723
ROP (Return to Oriented Programming)
コード領域には機械語が格納されている
ret命令で終わる小さなコードの断片をgadgetとよぶ
gadgetを含んだ任意のコードをrop chainと呼ぶ
rop chainを構築して実行させる攻撃手法のことをROP呼ぶ
PIEでないときコード領域のベースアドレスは固定→ASLR回避
コード領域は実行可能属性→DEP回避
2021/5/12
Rits Security Team
2
ROP (Return to Oriented Programming)
 gadgetを探し,gadgetの組み合わせをスタックに積む
 ret命令後,espが指すアドレス先に制御が移るので,スタックに積まれた順に次々と
gadgetが実行されていく
 その気になれば,シェルコードも実行できるよね
 …でも,あまり現実的でない(そもそもint 0x80命令のgadgetは無い) → どこで使う?
2021/5/12
Rits Security Team
3
AAA…A
addr of gadget
code
addr of gadget
…
add eax, 4;
ret;
…
pop ebx;
ret;
stack
gadget
Attack Process1 (題材:lec1/non_pop)
2021/5/12
Rits Security Team
4
Attack Process1 方針
2021/5/12
Rits Security Team
5
Attack Process1 rop chainの構築
2021/5/12
Rits Security Team
6
AAA…A
win_func1
win_func2
flag
0xBAAAAAAD
0xDEADBAAD
スタックをこのようにすればよい
(エクスプロイトコードはwriteupにある)
Attack Process2 (題材:lec1/rop)
2021/5/12
Rits Security Team
7
Attack Process2 方針
2021/5/12
Rits Security Team
8
Attack Process2 引数が邪魔
2021/5/12
Rits Security Team
9
AAAA
win2
win1
0xcabedabf
0xbeaafeef
0xfabebade
• ここにflagを置きたいが,win2の
引数があって置けない
• win2の引数も,同理由で置けない
→引数をgadgetを使ってpop命令で
引数を除去する
flag
Arg1
of
win1
Attack Process2 引数を除去する
2021/5/12
Rits Security Team
10
AAAA
win2
pop3
0xcabedabf
0xbeaafeef
0xfabebade
pop3 = pop esi; pop edi; pop ebp; ret;
win1
flag
0xaaaabbbb
gadgetの探し方
rp++ を使う場合
 How to install
 How to use
 あとは,cat gadget | grep pop とかで探せばよい
2021/5/12
Rits Security Team
11
wget https://github.com/0vercl0k/rp/releases/download/v1/rp-lin-x64
wget https://github.com/0vercl0k/rp/releases/download/v1/rp-lin-x86
chmod +x rp-lin-x64 rp-lin-x86
mv rp-lin-x64 rp-lin-x86 /usr/local/bin
rp-lin-x86 --file=vuln --rop=3 --unique > gadget.txt
バイナリ
を指定
gadgetの
最大長
おまじない
gadgetの探し方
pwntoolsを使う場合((必要なくても)gadgetを補完してくれる)
2021/5/12
Rits Security Team
12
gadgetの探し方
pwntoolsで任意のgadgetを探すとき (どちらにせよ,改行コードとかを平気で含むので注意)
2021/5/12
Rits Security Team
13
問題
rop (original)
leap-frog (picoCTF 2019)
2021/5/12
Rits Security Team
14

Return Oriented Programming