| |
| |
| |
| |
| |
| |
| |
| |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <cstring> |
| #include <cstdio> |
| #include <sys/mman.h> |
|
|
| |
| static void mb_write(void* dst, size_t offset, const uint8_t* src, size_t src_size) { |
| auto ptr = static_cast<uint8_t*>(dst); |
| std::memcpy(ptr + offset, src, src_size); |
| } |
|
|
| int main() { |
| setvbuf(stdout, NULL, _IONBF, 0); |
| |
| const size_t dst_cap = 4096; |
| uint8_t* dst = static_cast<uint8_t*>( |
| mmap(nullptr, dst_cap, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0)); |
|
|
| |
| uint8_t src[16]; |
| memset(src, 0x42, sizeof(src)); |
| size_t attacker_offset = 0x200000; |
|
|
| printf("[*] dst region capacity = %zu bytes\n", dst_cap); |
| printf("[*] attacker offset = 0x%zx (%zu bytes past the region)\n", |
| attacker_offset, attacker_offset); |
| printf("[*] NO check that offset+size <= capacity; calling memcpy(dst+offset, src, %zu)...\n", |
| sizeof(src)); |
| fflush(stdout); |
|
|
| mb_write(dst, attacker_offset, src, sizeof(src)); |
|
|
| printf("[x] returned without crashing (unexpected)\n"); |
| munmap(dst, dst_cap); |
| return 0; |
| } |
|
|