Как Visual Studio решает порядок, в котором должны быть выделены переменные стека?

Я пытаюсь повернуть некоторые программы в Небезопасном Программировании Геры примером в клиент-серверные приложения, которые могли быть использованы в получении сценарии флага для обучения разработки использования. Проблема, которую я имею, состоит в том, что я не уверен, как 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
задан Jason 5 May 2010 в 02:22
поделиться

1 ответ

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

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

2
ответ дан 3 September 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: