r4ge against the radare2
angr meets radare2
radare2(以下r2)にはpluginという概念があり,ghidraのデコンパイラを無理矢理使えるようにしたr2ghidraやWeb UIでROP gadgetを組む事ができるraropなど,多種多様なpluginが公開されており,r2pm
でインストールできる.doc
しかし,それらプラグインには開発が活発では無いものもあり,数年間放置されているようなpluginもザラである.
r2でangrを操作するインターフェイスを提供するpluginであるr4geもその1つであり,最新のcommitは2019年のものという残念な状況である.
ちなみに他にもr2でangrやるpluginはあるっぽいけど,そっちはもっとメンテされてない.
使いたい
使いたいので,なんとか使えるようにした.
普段Pythonを書かないので,キレながら修復してなんとかr4ge.py
あたりは動くようにした
そもそもPython2だったり(Hackerのツール,Python2系がち),r2のmacro記法が間違って(変わって?)いたり,なぜかいらない引数を渡していたり,ちょっと理解できない部分が多かったが,なんとかr4ge.py
は動くようになったので,以下サンプル.
example/r4ge
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FLAG "thank_you_for_using_r4ge"
int check(char *in) {
int ret = 1;
int len = strlen(FLAG);
ret = strncmp(in, FLAG, len);
return ret == 0;
}
void hello() {
puts("Hello, radare2 and r4ge");
}
int main() {
hello();
char *buf = malloc(0x20);
printf("input: ") ;
fgets(buf, 0x1f, stdin);
if (check(buf))
puts("Correct!");
else
puts("Incorrect!");
return 0;
}
__attribute__((constructor))
void setup() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
}
こんな感じのシンプルな入力をチェックするバイナリをr2とangrで解く.
r4ge
は.(r4ge)
で実行されるようにマクロが登録されており(installrc
参照),適切にflagを設定した上で.(r4ge)
を実行するとangrがいい感じにパスを見つけてくれる.
必要なフラグはr4ge.start
,r4ge.find
,r4ge.avoid
find
及びavoid
は複数設定できる.startswith
で判別しているので,suffixに数字とか付けとけば良い.
other macro
他にもcallFunction
等のマクロがあるので,全部使えるように修正していきたい.
(callFunction
は一応使えるようにした)
bug
現在わかっているバグ
r4geの実行後,IPython
のインタラクティブな環境を立ち上げる事が出来るが,2度目(1度IPythonを終了した後)以降,Bad file desciptor
で失敗する.なにこれ
Comments