Citizen fears emperor.
Slave fears citizen.
Emperor fears slave.
libcitizen.so
、libemperor.so
、libslave.so
の3つのライブラリとmain.cをプレゼントされた
main.c
/**
$ gcc main.c -L./ -lemperor -lcitizen -lslave
$ LD_LIBRARY_PATH=./ ./a.out
*/
#include <stdio.h>
char *emperor_flag(void);
char *citizen_flag(void);
char *slave_flag(void);
int main(void) {
printf("The flag is %s%s%s\n", emperor_flag(), citizen_flag(), slave_flag());
return 0;
}
emperor_flag()
, citizen_flag()
、slave_flag()
の3つの関数の出力を繋ぐとflagになりそう
なお、このコードをそのままコンパイルして実行すると[libslave.so] Citizen despises slave.
と言われて落ちる
とりあえず各ライブラリから似たような出力を残して落ちるようになっている処理の手前のje
やjne
をjmp
に書き換えて無視できるようにした
この状態で再度main.cをコンパイルして実行するとResouce Errorで怒られる
しかし、1種類だけ表示させるコードは正常に動作したので、それぞれに対して1種類表示する実行ファイルを用意して手動で出力を繋いだらいけた
KosenCTF{emperor_wins_with_a_probability_of_four-fifths}