二进制 clock_nanosleep "bypass"
Binary clock_nanosleep "bypass"
我目前正在学习编程,并在业余时间做 CTF 以获得一些额外的技能。
现在我正面临一个二进制文件(我没有源代码但可以 ghidra 它):
- putchar 单个字符
- clock_nanosleep X 秒
- putchar 单个字符
- clock_nanosleep Y 秒
- ...
(我对二进制文件进行了跟踪,发现二进制文件使用“clock_nanosleep”和“CLOCK_REALTIME”)
我的问题是:有没有办法在跳过“clock_nanosleep”的同时执行二进制文件?
我的猜测:
- 也许阻止他 time.h 库,这样他就不能执行“clock_nanosleep”?
- 也许修改“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 脚本实现自动化。
我目前正在学习编程,并在业余时间做 CTF 以获得一些额外的技能。
现在我正面临一个二进制文件(我没有源代码但可以 ghidra 它):
- putchar 单个字符
- clock_nanosleep X 秒
- putchar 单个字符
- clock_nanosleep Y 秒
- ...
(我对二进制文件进行了跟踪,发现二进制文件使用“clock_nanosleep”和“CLOCK_REALTIME”)
我的问题是:有没有办法在跳过“clock_nanosleep”的同时执行二进制文件?
我的猜测:
- 也许阻止他 time.h 库,这样他就不能执行“clock_nanosleep”?
- 也许修改“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 脚本实现自动化。