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あたりは動くようにした

n01e0/r4ge

そもそも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.startr4ge.findr4ge.avoid

find及びavoidは複数設定できる.startswithで判別しているので,suffixに数字とか付けとけば良い.

r4ge example

other macro

他にもcallFunction等のマクロがあるので,全部使えるように修正していきたい.

(callFunctionは一応使えるようにした)

bug

現在わかっているバグ

r4geの実行後,IPythonのインタラクティブな環境を立ち上げる事が出来るが,2度目(1度IPythonを終了した後)以降,Bad file desciptorで失敗する.なにこれ