Переполнение буфера в C

Я пытаюсь написать простое переполнение буфера, используя C в 64-битной Mac OS X 10.6. Вот концепция:

void function() {
    char buffer[64];
    buffer[offset] += 7;    // i'm not sure how large offset needs to be, or if
                            // 7 is correct.
}

int main() {

    int x = 0;
    function();
    x += 1;
    printf("%d\n", x);      // the idea is to modify the return address so that
                            // the x += 1 expression is not executed and 0 gets
                            // printed

    return 0;
}

Вот часть дампа ассемблера main:

...
0x0000000100000ebe <main+30>:   callq  0x100000e30 <function>
0x0000000100000ec3 <main+35>:   movl   $0x1,-0x8(%rbp)
0x0000000100000eca <main+42>:   mov    -0x8(%rbp),%esi
0x0000000100000ecd <main+45>:   xor    %al,%al
0x0000000100000ecf <main+47>:   lea    0x56(%rip),%rdi        # 0x100000f2c
0x0000000100000ed6 <main+54>:   callq  0x100000ef4 <dyld_stub_printf>
...

Я хочу перепрыгнуть через инструкцию movl , что означает, что мне нужно увеличить адрес возврата на 42 - 35 = 7 (верный?). Теперь мне нужно знать, где хранится адрес возврата, чтобы я мог вычислить правильное смещение.

Я попытался найти правильное значение вручную, но либо печатается 1, либо я получаю прерывание прерывания - это Может быть, действует какая-то защита от переполнения буфера?


На моей машине работает смещение 88. Я использовал подход Nemo для определения обратного адреса.

18
задан Bill the Lizard 15 September 2012 в 23:22
поделиться