Доброго всем времени суток. Есть такой код. // cl local.c /Zi /link /base:0x08040000 ws2_32.lib #include <stdio.h> #include <string.h> #include <fcntl.h> #include <winsock2.h> #include <windows.h> #define SIZE_BUF 461 unsigned char c; unsigned int limit = SIZE_BUF + 100; int processing_request (int, int, int, int); int main (unsigned int argc, char *argv[], char *envp[]) { processing_request (0xBAADBAAD, 0xBAADBAAD, 0xBAADBAAD, 0xBAADBAAD); return 0; } int processing_request (int a, int b, int c, int d) { char *info = "complete\n"; struct { char buf[SIZE_BUF]; unsigned int i; } s; s.i = 0; while (_read (fileno (stdin), &c, 1) > 0) { if (c == '\n'){ s.buf[s.i] = 0; break; } s.buf[s.i++] = c; if (s.i > limit){ break; } } printf ("read %d bytes\n", s.i); printf (info); memset (&a, 0xDA, 16); return s.i; }Задача вообще стоит такая: переполнением локального буфера выполнить свой шеллкод. Суть в том, почему-то когда я через консоль подаю на программе файл с символами так: local.exe < text.txt. Либо python -c 'print("A"*600)' | local.exe . Но получается что _read возвращает 0 и идет возврат из while, считывает максимум 413 +- байт, и выходит из цикла еще до переполнения буфера. Делал на windows xp sp2, запускал таким образом программу раз 50, и все время одно и тоже.
Ну засунь в отладчик, попробуй получить GetLastError. Вообще попрактикуйся в отладчике, потому что переписывание примеров из книг не всегда дают знания, а когда ты возишься два дня, после чего прозреваешь так тогда знания на долго в голове застряют.
Да забыл отписаться в эту тему) уже разобрался, получалось, что просто перетирал счетчик, когда шло переполнение буффера. Отттого и получался такой результат.