<< 13/20 >>
First Last

事例3 - 別ターゲット

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