75 年後にフラグを出力するプログラムを作ったので、2100 年まで待ってね!
sleep関数の待機を回避する
decomp
undefined8 main(void) {
puts("I\\'ll sleep for 75 years...");
sleep(0x8d12cea0);
show_flag();
return 0;
}
sleepが終わればshow_flagが実行されるようだ
解法1 LD_PRELOADの上書き
標準ライブラリのsleep()の挙動を上書きする
// nosleep.c
#define _GNU_SOURCE
#include <unistd.h>
#include <time.h>
unsigned int sleep(unsigned int seconds) { (void)seconds; return 0; }
int nanosleep(const struct timespec *req, struct timespec *rem) { (void)req; (void)rem; return 0; }
gcc -shared -fPIC -O2 -o nosleep.so nosleep.c
LD_PRELOAD=./nosleep.so ./print_flag
解法2 GDBでsleepの引数を変更
gdb -q ./print_flag
b sleep
r
set $rdi=0
c
おまけ
GEFを使っているとbreakした時の処理をまとめて書けるので覚えておくと便利
gdb -q ./print_flag
start
command-break sleep "set $rdi=0"
c