int 0x80 を探して置きかえたり
if (prot & PROT_EXEC) { char* a = elf + poff; int l = pfsize; while (1) { char* f = memmem(a, l, "\xcd\x80", 2); // int 0x80 if (f == NULL) break; char* intr = (char*)paddr + (f - (elf + poff)); LOG("int $0x80 at %p\n", intr); l -= f - a + 1; a = f + 1; intr[0] = 0x0f; // ud2 intr[1] = 0x0b; } }
この場合 ud2 に変えて SIGILL をハンドルして処理
他にも関数呼び出しを書き換えたり、実行したくない命令を nop で埋めたり、ご自由に
うっかり operand に memmem がマッチしちゃったりした場合、適当にブラックリストを作ればいい