Как Visual Studio определяет порядок размещения переменных стека? - PullRequest
1 голос
/ 05 мая 2010

Я пытаюсь превратить некоторые программы из Небезопасное программирование gera на примере в клиент-серверные приложения, которые можно использовать в сценариях захвата флагов для обучения разработке эксплойтов. У меня проблема в том, что я не уверен, как Visual Studio (я использую 2005 Professional Edition) решает, где разместить переменные в стеке.

Когда я компилирую и запускаю пример 1:

int main() {
    int cookie;
    char buf[80];

    printf("buf: %08x cookie: %08x\n", &buf, &cookie);
    gets(buf);

    if (cookie == 0x41424344)
        printf("you win!\n");
}

Я получаю следующий результат:

buf: 0012ff14 cookie: 0012ff64

buf начинается с адреса на восемьдесят байтов ниже cookie, а любые четыре байта, скопированные в buf после первых восьмидесяти, появятся в cookie.

Проблема в том, что я помещаю этот код в какую-то другую функцию. Когда я компилирую и запускаю следующий код, я получаю другой результат: buf появляется по адресу, большему cookie.

void ClientSocketHandler(SOCKET cs){
 int cookie;
 char buf[80];
 char stringToSend[160];
 int numBytesRecved;
 int totalNumBytes;

 sprintf(stringToSend,"buf: %08x cookie: %08x\n",&buf,&cookie);
 send(cs,stringToSend,strlen(stringToSend),NULL);

Результат:

buf: 0012fd00 cookie: 0012fcfc

Теперь нет способа установить cookie для произвольных данных путем перезаписи buf. Есть ли способ сказать Visual Studio выделить cookie до buf? Можно ли заранее сказать, как будут распределяться переменные?

Спасибо

Jason

Ах, хорошо. Да, я думаю, что структуры должны будут сделать. Спасибо за помощь.

1 Ответ

2 голосов
/ 05 мая 2010

Попробуйте отключить оптимизацию компилятора.

Если оптимизация уже отключена, лучше всего заставить компилятор размещать локальные переменные в определенном порядке - разместить локальные переменные в структуре и разместить эту структуру в локальном стеке. Поля в этой структуре с меньшей вероятностью будут перемещаться (относительно друг друга) компилятором, чем независимые локальные переменные.

...