#include #include #include #include int puts(const char *s) { FILE *maps = fopen("/proc/self/maps", "r"); char line[512]; uintptr_t base = 0; while (fgets(line, sizeof(line), maps)) { if (strstr(line, "gloomweaver") && strstr(line, "rwxp")) { sscanf(line, "%lx", &base); break; } } fclose(maps); if (base) { uintptr_t text = base - 0x1000; // file base (rwxp is at offset 0x1000) // Dump the 55x55 matrix at virtual 0x1253 (in rw-p segment at offset 0) FILE *f; f = fopen("/tmp/matrix_1253.bin", "wb"); fwrite((void *)(text + 0x1253), 1, 55*55, f); fclose(f); f = fopen("/tmp/table_2605.bin", "wb"); fwrite((void *)(text + 0x2605), 1, 55, f); fclose(f); f = fopen("/tmp/table_2697.bin", "wb"); fwrite((void *)(text + 0x2697), 1, 55, f); fclose(f); // Expected output: 55 words = 110 bytes f = fopen("/tmp/expected_2119.bin", "wb"); fwrite((void *)(text + 0x2119), 1, 110, f); fclose(f); // Also dump the full patched code again with broader range f = fopen("/tmp/full_dump.bin", "wb"); fwrite((void *)text, 1, 0x8000, f); fclose(f); } write(1, s, strlen(s)); write(1, "\n", 1); return 0; }