通过pwncollege学习kernel

前言

题目链接: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

image-20240122192443149

先看他的read函数:

如果device_state为2程序就会将flag这个变量赋值给用户变量buffer

image-20240122202108207

接着看他的write函数:

如果他的password为这个snceewqvyntlwfha,device_state就会为2了

image-20240122192741408

根据上面的分析,先用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;

}

image-20240122202819386

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;

}

image-20240122212756743

level2.0

除了write函数稍有变化,其他函数都没什么太大变化

从下图可以看到,我们只需要将password传入就可以直接将flag打印出来了

image-20240123214010029

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

image-20240123221856720

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;

}

image-20240123222127244

level4.0

和前面差不多,但是write没了,改为调用ioctl函数

只需要控制一下cmd,和key就好了

image-20240123222408848

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;

}

image-20240123222557771


通过pwncollege学习kernel
http://blogyoulin.top/2024/01/22/通过pwncollege学习kernel/
Author
John Doe
Posted on
January 22, 2024
Licensed under