Pull to refresh

Comments 8

Белые пятна — это, по всей видимости, локальные переменные и аргументы функций стартап-кода си-библиотеки.

В случае libc это будут _start и __libc_start_main

Платформенно-зависимая _start:
x86_64
i386
и т.п. для других платформ

и независимая часть в __libc_start_main:
libc-start.c

Возможно и gdb покажет больше с отладочной версией libc
Посмотрел, спасибо, там, как раз самое интересное оказывается :)
Сделал небольшой стековерфло :). В тексте тоже подправлю.
#include <stdio.h>

void **ret;
void *leave;

void foo(){
    void (*boo)(void); //указатель на функцию
    printf("Stack rewrite!\n");
    boo = (void (*)(void))leave; 
    boo(); // fini()
}

int main(int argc, char *argv[], char *envp[]) {
   int a[123] = {0};
   unsigned long int mark = 0xbfbfbfbfbfbfbfbf; //метка, от которой будем работать
   ret = (void**)(&mark+2); // извлекаем адрес, функции, вызываемой после завершения (fini)
   leave = *ret;             // запоминаем  
   *ret = (void*)foo;       // перетираем
   return 0;                // вызов функции foo()
}
сейчас проверил на другой машине — не работает, т.к. там другой порядок расположения переменных в стеке.
Вместо Denwer читать, конечно же, Darwin.
Возле заголовка должна быть пиктограмма редактирования статьи.
Спасибо, поправил в тексте.
Очень правильная статья для дня программиста :)
А еще валиден такой код
int main[] = {1, 2, 3};
Sign up to leave a comment.

Articles