0

OS X でバッファに保存されたアセンブリ コードを実行しようとしていますが、セグメンテーション エラーが発生し続けます。コードは次のようになります。

int main()
{
    unsigned char buff[] = "\x66\x6a\7f\x66\xb8\x01\x00\x00\x00\x66\x83\xec\x04\xcd\x80";
    ( void (*)()buff )(); /* same as calling return 127 */
    return 0;             /* program should never reach here */
}

buff のコードは nasm によって生成され、動作します。プログラムは 127 を返します。ただし、このように ac プログラムを実行すると、セグメンテーション エラーが発生します。OS Xでこれを行う別の方法はありますか?

4

2 に答える 2

2

スタックはデフォルトでは非実行可能です。ページを実行可能にするには、ページを実行可能としてマークする必要がありmprotect(2)ます。スタックを実行可能にすることは強く推奨されないため、実行時に生成されたコードを実行する場合は、代わりにヒープにメモリを割り当てる必要があります。

例えば:

#include <sys/mman.h>
#include <unistd.h>

...

// Error checking omitted for expository purposes

// Allocate 1 page of read-write memory
size_t page_size = getpagesize();
void *mem = mmap(NULL, page_size,
                 PROT_READ | PROT_WRITE,
                 MAP_ANON | MAP_PRIVATE,
                 -1, 0);
// Copy the shell code into the memory
char shellcode[] = "...";
memcpy(mem, shellcode, sizeof(shellcode));

// Change memory to executable and non-writable
mprotect(mem, page_size, PROT_READ | PROT_EXEC);

// Run the code
((void (*)())mem)();

// Free the memory
munmap(mem, page_size);
于 2013-08-22T19:50:40.717 に答える