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