pServ - небольшой Web сервер. Пакет pServ содержит несколько переполнений буфера, которые позволяют удаленному атакующему выполнять произвольный код с привилегиями Web сервера.
Однобайтовое переполнение в Stream Reading
pServ выделает 1024 байт для строкового буфера и затем пытается читать полный размер блока. Можно обнулить один байт EBP (x86), посылая сообщение TCP потока, имеющего размер ровно 1024 байт, на сервер.
Переполнение буфера в методе запроса
pServ принимает 1024 байта в каждой строке запроса, но распределяет только 16 байтов (согласно определению "request.method" в main.h) для этих данных, так что запрос:
[buffer 1К] / HTTP/1.0
Перезапишет 1008 байт памяти.
Переполнение буфера в HTTP версии
pServ распределяет только 16 байтовый буфер для "request.protocolVersion" в main.h. Запрос типа:
GET / HTTP/1.[buffer]
Перезапишет 1008 байт памяти.
Переполнение буфера в User-Agent
pServ выделяет только 256 байтовый буфер для строки User-Agent, которая может быть больше на 1011 байт, тем самым атакующий может перезаписать 755 байт данных:
GET / HTTP/1.0
User-Agent: [buffer]
Переполнение буфера в HTTP запросе. Пример:
GET / HTTP/1.0[\n]