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 がマッチしちゃったりした場合、適当にブラックリストを作ればいい