Я пытаюсь повернуть некоторые программы в Небезопасном Программировании Геры примером в клиент-серверные приложения, которые могли быть использованы в получении сценарии флага для обучения разработки использования. Проблема, которую я имею, состоит в том, что я не уверен, как 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
А-ч, хорошо. Да, я предполагаю, что структуры должны будут сделать. Спасибо за справку.
Попробуйте отключить оптимизацию компилятора.
Если оптимизация уже отключена, лучше всего заставить компилятор размещать локальные переменные в определенном порядке - это поместить локальные переменные в структуру и выделить эту структуру в локальном стеке. Поля в этой структуре с меньшей вероятностью будут перемещаться (относительно друг друга) компилятором, чем независимые локальные переменные.