hwaddr.len
- это неподписанный символ, имеющий диапазон от 0 до 255. Таким образом, злоумышленник может отправить вам пакет, который объявляет длину 255. Поскольку hwaddr.addr
объявлен как 128-байтовый буфер, злоумышленник может затем доставить полезную нагрузку.из 127 байтов.Достаточно ли этого?
Обычное соглашение о вызовах x86 заключается в отправке адреса возврата, рассылке аргументов и последующем переходе, после чего вызываемый объект будет выделять каждую переменную в объявленном порядке.Таким образом, начиная с начала hwaddr
, hwaddr.len
будет на 128 байт выше указателя стека, packet
будет на 129 байт выше, а адрес возврата будет 129 + sizeof(char *)
, что составляет не более 137 байт даже на64-битная система.Итак, да, злоумышленник может перезаписать ваш обратный адрес и дополнительно доставить 118 байт шелл-кода.
Редактировать Я только что выяснил путаницу ОП.Когда вы кодируете длину как unsigned char
, это означает, что не означает, что вы используете ASCII для представления длины.То есть вы не читаете этот байт, вызываете на нем atoi()
и получаете однозначное число в диапазоне от 0 до 9. Вы просто используете восемь битов, как очень узкий тип int
, где каждый бит представляетдвоичный символ.