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