Весь рабочий код написан в моём посте 22:49:13 Гдето там ошибочка)) Никак найти не могу (( Сейчас попробую через gdb посмотреть, что там твориться. AndreyMust19 Такой вопрос, Каким образом может возникнуть переполнение буфера? Просто у меня, теоретически, всегда будет фактическая длина строки меньше чем 65536 А больше 65536 байт данных, метод POST передавать не может. И в read стоит ограничение на 65536 принятых символов.Переполнения, как мне кажится быть не должно
Хех ))) нашлась первая ошибка... в ;системный вызов write mov eax,4 mov ebx,[fd] ; сохраняем в дескриптор открытого файла mov ecx, http_login_buf ; записываем логин ; edx равен колличеству символов в логине EDX не равен колличеству всимволов в логине т.к. int 0x80 перед вызовом write был ;системный вызов open mov eax,5 ; syscall open mov ebx,path_file mov ecx,0001002 mov edx,7666 int 0x80 mov [fd],eax ; записываем в fd номер возвращённого дескриптора функции open Который затёр edx Тока вот теперь, приложение завершает свою работу с созданием файла core. Приложение генерирует сигнал SIGSEGV - ошибка доступа к памяти (указывает на то, что процесс обратился к недопустимому адресу памяти)
Последний момент в коде) Ошибка в rep movsb . При попадании на эту инструкцию, появляется сигнал SIGSEGV Код (Text): mov esi, [http_login_param_buf+6] ; логин начинается тут mov edi, [http_login_buf] ; в edi адресс куда будем копировать логин mov ecx, edx ; счётчик равен колличеству символов в логине rep movsb ; повторить ecx раз, копирование [http_login_param_buf+6] в http_login_buf А вот тото же код, но теперь чуточку упращён. Код (Text): ;Секция не инициалезированных данных BSS section .bss fd resd 1 ; резервируем 4 байт для возвращаемого дескриптора функции open http_login_buf resb 100 ; зарезервировать память в 100 байт для логина переданного через форму. section .date http_login_param_buf db "login=stellaco&password=123" http_login_string db "login=" ; строка login= передаваемая от клиента серверу path_file db 'test.txt',0 global _start _start: ;ТУТ РАБОТАЕТ ВСЁ ПРАВИЛЬНО!!!! ;сканирование логина mov edi, http_login_param_buf ; буфер для всех принятых данных методом POST mov esi, http_login_string ; строка "login=" mov ecx,6 ; сколько первых символов строк нужно сравнить (адресуемые регистрами ESI и EDI) rep cmpsb ; сравниваем две строки, адресуемые регистрами ESI и EDI jnz exit ; проверяем флаг нуля, если не ноль, то строки не совпали и прыгаем на incorrect ; до этого момента проблем нет mov al, "&" ; что будем искать mov ecx, 65530 ; записать в счётчик 65530 (размер сканируемой строки) repne scasb ; поиск & в массиве из 65530 байт jnz exit ; переход на метку incorrect , если не нашли mov edx, 65530 ; inc ecx sub edx, ecx ; в edx размер логина в байтах cmp edx, 100 ; узнаём, хватит ли места в BSS для логина (http_login_buf) jg exit ; если больше , (не хватит места в BSS для переданного логина) то incorrect ;ТУТ ЗАКАНЧИВАЕТСЯ БЛОК КОДА С ПРАВИЛЬНЫМ ФУНКЦИАНИРОВАНИЕМ!!! ;ВОТ ТУТ ВОТ ОШИБОЧКА..ТОЧНЕЕ В rep movsb mov esi, [http_login_param_buf+6] ; логин начинается тут mov edi, [http_login_buf] ; в edi адресс куда будем копировать логин mov ecx, edx ; счётчик равен колличеству символов в логине [b]rep movsb[/b] ; повторить ecx раз, копирование [http_login_param_buf+6] в http_login_buf ;окончание сканирования логина mov esi, edx ; сохраняем значение edx(размер логина в байтах) чтоб оно не было затёрто syscall-ами Грешу вот на это http_login_buf resb 100 в секции BSS Сейчас сам пробую это исправить..но всёже, пожалуйста посмотрите код..может кто-то справиться с этим быстрей чем я в этой части кода Код (Text): mov esi, [http_login_param_buf+6] ; логин начинается тут mov edi, [http_login_buf] ; в edi адресс куда будем копировать логин я правильно задаю адреса буфера и строки?
5 часов и 15 минут сиденья у компьютера. Принесли свои плоды! Проблема решена =) mov esi, [http_login_param_buf+6] - ВОТ ОНА ОШИБОЧКА не правильно записывался адрес. правильно вот так mov esi, http_login_param_buf+6 Спасибо AT&T синтаксису, и GDB и ВСЕМ кто давал ответы на мои вопросы.