二进制 clock_nanosleep "bypass"

Binary clock_nanosleep "bypass"

我目前正在学习编程,并在业余时间做 CTF 以获得一些额外的技能。

现在我正面临一个二进制文件(我没有源代码但可以 ghidra 它):

(我对二进制文件进行了跟踪,发现二进制文件使用“clock_nanosleep”和“CLOCK_REALTIME”)

我的问题是:有没有办法在跳过“clock_nanosleep”的同时执行二进制文件?

我的猜测:

  1. 也许阻止他 time.h 库,这样他就不能执行“clock_nanosleep”?
  2. 也许修改“CLOCK_REALTIME”让程序认为时间已经过去并完成“clock_nanosleep”?

补充信息:

文件:ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5eca63735d90098f20f45ca172e242372994976e, for GNU/Linux 3.2.0, stripped

字符串:/lib64/ld-linux-x86-64.so.2 libc.so.6

您可以 LD_PRELOAD 终止 clock_nanosleep 调用:

#include <time.h>

int clock_nanosleep(clockid_t clockid, int flags,
                    const struct timespec *request,
                    struct timespec *remain) {
    return 0;
}

编译

> gcc inject.c -shared -fPIC -o inject.so

和运行以及

> LD_PRELOAD=$PWD/inject.so ./program

这将通过立即 return 有效地禁用对 clock_nanosleep 的调用。


如果您不想 运行 您的程序在 LD_PRELOAD 下,您可以通过解决方案发挥创意 - 例如,将调用 clock_nanosleep 的每个操作码修补为 [=18] =]s,可通过 Ghidra 脚本实现自动化。