这次比赛看了蛮多题目的,但是只出了这么一题。(还有一道被其他师傅先交了)
简单的略过没有看到 Pwn 分类以为是没有 Pwn 题,所以就去复现了一下国赛 Build 环节的 pwn 题,赛后 ha1 告诉我是有 pwn 题的(国外比赛真不一样),希望下次比赛能再多做出几道题目。
题目是一道内核 Re 题,给了一个 ssh 可供连接,连上去之后发现/dev/ioctl 中对应的内核文件就是题目所给出的内核文件。
重点关注这部分可以得知,只需要传递的参数内容符合条件就会把 flag 信息写回到我们传入的参数的那段内存空间中,于是我尝试了解 ktime_get_real_ts64 函数并编写 exp 程序,最后解题程序如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
int main()
{
int fd = open("/dev/ioctl", O_RDWR);
if (fd < 0)
{
printf("open file error!!\n");
exit(-1);
}
char flag[128];
unsigned int val1 = 0x13373389;
gettimeofday((struct timeval *)flag, NULL);
*(unsigned int *)flag = *(unsigned int *)flag ^ val1;
ioctl(fd, 0x5702, flag);
printf("%s\n", flag);
}
|
虽然这道题目非常简单,但是对于我自己来说是一个新的开始。我大概了解了如何与 ioctl 的内核文件进行交互,这对于我来说是一个全新的开始。