Поиск символа в строке

Тема в разделе "WASM.BEGINNERS", создана пользователем stellaco, 18 дек 2008.

  1. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Весь рабочий код написан в моём посте 22:49:13
    Гдето там ошибочка))
    Никак найти не могу ((
    Сейчас попробую через gdb посмотреть, что там твориться.


    AndreyMust19
    Такой вопрос,
    Каким образом может возникнуть переполнение буфера?
    Просто у меня, теоретически, всегда будет фактическая длина строки меньше чем 65536

    А больше 65536 байт данных, метод POST передавать не может. И в read стоит ограничение на 65536 принятых символов.Переполнения, как мне кажится быть не должно
     
  2. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Ну тогда все нормально, я ж не знал!
     
  3. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Хех )))
    нашлась первая ошибка...

    в
    ;системный вызов 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 - ошибка доступа к памяти (указывает на то, что процесс обратился к недопустимому адресу памяти)
     
  4. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Последний момент в коде)
    Ошибка в rep movsb . При попадании на эту инструкцию, появляется сигнал SIGSEGV


    Код (Text):
    1. mov esi, [http_login_param_buf+6] ; логин начинается тут
    2. mov edi, [http_login_buf] ; в edi адресс куда будем копировать логин
    3. mov ecx, edx ; счётчик равен колличеству символов в логине
    4. rep movsb ; повторить ecx раз, копирование [http_login_param_buf+6] в http_login_buf
    А вот тото же код, но теперь чуточку упращён.
    Код (Text):
    1. ;Секция не инициалезированных данных BSS
    2. section .bss
    3. fd resd 1 ; резервируем 4 байт для возвращаемого дескриптора функции open
    4. http_login_buf resb 100 ; зарезервировать память в 100 байт для логина переданного через форму.
    5.  
    6.  
    7. section .date
    8. http_login_param_buf db "login=stellaco&password=123"
    9. http_login_string db "login=" ; строка login= передаваемая от клиента серверу
    10. path_file db 'test.txt',0
    11. global _start
    12. _start:
    13.  
    14. ;ТУТ РАБОТАЕТ ВСЁ ПРАВИЛЬНО!!!!
    15. ;сканирование логина
    16. mov edi, http_login_param_buf ; буфер для всех принятых данных методом POST
    17. mov esi, http_login_string ; строка "login="
    18. mov ecx,6 ; сколько первых символов строк нужно сравнить  (адресуемые регистрами ESI и EDI)
    19. rep cmpsb  ; сравниваем две строки, адресуемые регистрами ESI и EDI
    20. jnz exit ; проверяем флаг нуля, если не ноль, то строки не совпали и прыгаем на incorrect
    21. ; до этого момента проблем нет
    22. mov al, "&" ; что будем искать
    23. mov ecx, 65530 ; записать в счётчик 65530 (размер сканируемой строки)
    24.  
    25. repne scasb ; поиск & в массиве из 65530 байт
    26. jnz exit ; переход на метку  incorrect , если не нашли
    27. mov edx, 65530 ;
    28. inc ecx
    29. sub edx, ecx ; в edx размер логина в байтах
    30. cmp edx, 100 ; узнаём, хватит  ли места в BSS для логина (http_login_buf)
    31. jg exit ; если больше , (не хватит места в BSS для переданного логина) то incorrect
    32. ;ТУТ ЗАКАНЧИВАЕТСЯ БЛОК КОДА С ПРАВИЛЬНЫМ ФУНКЦИАНИРОВАНИЕМ!!!
    33.  
    34. ;ВОТ ТУТ ВОТ ОШИБОЧКА..ТОЧНЕЕ В rep movsb
    35. mov esi, [http_login_param_buf+6] ; логин начинается тут
    36. mov edi, [http_login_buf] ; в edi адресс куда будем копировать логин
    37. mov ecx, edx ; счётчик равен колличеству символов в логине
    38. [b]rep movsb[/b] ; повторить ecx раз, копирование [http_login_param_buf+6] в http_login_buf
    39. ;окончание сканирования логина
    40. mov esi, edx ; сохраняем значение edx(размер логина в байтах) чтоб оно не было затёрто syscall-ами
    Грешу вот на это http_login_buf resb 100 в секции BSS

    Сейчас сам пробую это исправить..но всёже, пожалуйста посмотрите код..может кто-то справиться с этим быстрей чем я


    в этой части кода
    Код (Text):
    1. mov esi, [http_login_param_buf+6] ; логин начинается тут
    2. mov edi, [http_login_buf] ; в edi адресс куда будем копировать логин
    я правильно задаю адреса буфера и строки?
     
  5. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    5 часов и 15 минут сиденья у компьютера.
    Принесли свои плоды!
    Проблема решена =)
    mov esi, [http_login_param_buf+6] - ВОТ ОНА ОШИБОЧКА
    не правильно записывался адрес.
    правильно вот так mov esi, http_login_param_buf+6

    Спасибо AT&T синтаксису, и GDB

    и ВСЕМ кто давал ответы на мои вопросы.