問題

75 年後にフラグを出力するプログラムを作ったので、2100 年まで待ってね!

TL;DR

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