对于one gadget,经常需要满足一些特定条件,如RAX 为NULL(0),x86_64能够利用的几个gadgets,如libc_csu_init,vsyscall等,只有vsyscall满足这个条件。
刚测试了三个vsyscall的返回值,
__NR_gettimeofday使用空参数访问情况下返回值为0,即RAX = 0
__NR_time使用空参数访问返回值为当前时间,非0
__NR_getcpu使用空参数访问返回值为0,rax 0。
所以0xffffffffff600000 和0xffffffffff600800都可用于one gadget,
0xffffffffff600400不能用于one gadget
测试代码如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/syscall.h>
int main(void) {
int cpu,status;
int64_t test = -1;
status = syscall(__NR_time,NULL,NULL,NULL);
// gettimeofday(&tv,&tz); rax=>0
//time(&t); rax=1550144287
//getcpu;rax=0
asm ("mov %%rax,%0\n"
:"=g"(test):
);
printf("The rax value after vsyscall is %d\n",test);
printf("The ret value is %d\n",status);
return 1;
}
网友评论