PUSH [SFWORD DS:401234] или хз чё делать...

Тема в разделе "WASM.ASSEMBLER", создана пользователем psh, 16 сен 2009.

  1. psh

    psh New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    13
    Вобщем такая проблема. Нужно передать параметр winapi функции типа text но как последовательность байт в размере ~296 байт. Ну например вот MessageBox,0,Text,Caption,MB_OK , где обычно Text="Hello world!!! tratata...", а тут надо Text=48656C6C6F20776F726C6421212120747261746174612E2E2E
    Как в компиле это сделать хз...
    Посмотрел в ольке что можно сделать, а там если значения передаёт push 401234 то значение берётся начиная с этого адреса и по 00, но в моей конструкции данных 00 этот тоже данные которые надо передать например:27200000000180000904d4d4d00. Т.е. после 2720 в стек уже ни чё не запишется. А если делать PUSH [DWORD DS:401234], нули пишутся , но размер тока на 2ное слово а надо как мнимум 296 ;(
    Кто мож подскажет что тут можно придумать?
     
  2. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Эквивалентно

    push MB_OK
    lea eax,
    push eax
    lea eax, [Text]
    push eax
    push 0
    call [MessageBoxA]



    В твоем случае аналогично. Передавать не аргумент, а указатель на него.
    Что такое указатели - учим матчасть.


    lea eax, [my_array]
    push eax
    ....
    call my_func
     
  3. psh

    psh New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    13
    intel_x128, я ж написал, при исполюзовании конструкции push 12431А нули в стек не захватываются.В указателе будет находится адрес наших данных, разницы особой не будет.
     
  4. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    psh

    Скажу тогда прямо. Я нихрена не понял, что вам нужно.
    Если АПИ - то какая апи? Если функция самописная - то код функции в студию.
    И опишите задачу человеческим языком. Может и ответов больше будет
     
  5. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Ему нужно передать буфер, содержащий нули параметром MessageBox'у, а т.к. он режет строку по первый ноль у него ничего не получается. Если я правильно понял:)
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Если в этот странный Text добавить спецификатор h запятые и завершающий ноль
    db 48h, 65h, 6Ch, 6Ch, 6Fh, 20h, 77h, 6Fh, 72h, 6Ch, 64h, 21h, 21h, 21h, 20h, 74h
    db 72h, 61h, 74h, 61h, 74h, 61h, 2Eh, 2Eh, 2Eh, 0
    то как раз и получится строка "Hello world!!! tratata..."
    если передавать как строку в MessageBox, то как указатель на нее, причем завершающий ноль обязателен.
    есть вариант
    Код (Text):
    1. push MB_OK
    2. push offset Caption
    3. call @f
    4. db "Hello world!!! tratata...",0
    5. @@: push 0
    6. call _imp__MessageBoxA@16
    хотя есть еще более извратный
    Код (Text):
    1. push ".''
    2. push "..at"
    3. push "atar"
    4. push "t !!"
    5. push "!dlr"
    6. push "ow o"
    7. push "lleH"
    8. mov ebx,esp
    9. invoke MessageBox,0,ebx,Caption,MB_OK
    10. add esp,7*4; приводим стек в нормальное состояние
    для передачи длинных строк лучше написать макрос, который всю рутину сделает за тебя. Строку, в середине которой есть нули разорвет однозначно
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Вероятно автору это нужно для того, чтобы вызвать переполнение буфера, если передаётся строка тогда нули нельзя использовать для атаки.
    В любых других случаях передаются в функции ссылки на массивы, строки и структуры, незачем копировать в стек саму строку. Чисто теоретически можно сделать цикл копирования строки в стек.
     
  8. psh

    psh New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    13
    Clerk, ну вобщем да. Хотел переписать один експлоит со скрипта на асм. Параметр передаётся функции sendto, уже почти всё что надо написал(с нормалтными строками код пашет), косяк с передачей строки, он тупо обрезается по нуля и всё.
    Напрмер тут так(скрипт):
    buff = ("\x00\x00\x00\x90\xff\x53\x4d\x42\x72\x00\x00\x00\x18")
    send(buff)
    и готово.
    А на асме таки строки притом через апи х передашь, при том что это utf-8 и на выходе должно быть(00000090ff534d42720000000018)
    Вот и подумал, возможно ли такое на ассемблере реализовать(с извратами там или хоть какнить)
     
  9. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    mov ecx, string_lenght
    mov esi, string_start (или string_end)
    (std или cld)
    pp:
    lodsd
    push eax
    loop pp

    и пихай в стек строки, хоть с нулями, хоть с чем, хоть до 4Гб длиной ;)
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    FatMoon
    Тогда уж
    Код (Text):
    1. mov edi,esp
    2. mov esi,offset string_start
    3. rep movsd
     
  11. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    FatMoon,Mikl___
    Мож я чего-то недопонял, но в сплойте почти наверняка никому не нужно засовывать строку в свой стек, нужно в чужой =)

    psh
    Чтобы нулей не было, ксорить нужно =)
     
  12. psh

    psh New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    13
    Дык мне помимо того, что все эти данные надо запихать в стек, дак еще и указать функе те данные 1им параметром. Т.Е. надо с нулями все это в одну ячейку положит и тада push eax в цыкле не прокатит.
     
  13. Dryu

    Dryu New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2009
    Сообщения:
    9
    Если тебе надо скормить эту строку чужой функции как указатель, то, если она останавливает обработку на нуле(как бОльшая часть API), ноль ты ей не скормишь. Короче говоря, всё определяется логикой функции. Например, WriteFile принимает нули, потому как ограничителем является отдельный параметр, содержащий длину строки.
     
  14. Dryu

    Dryu New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2009
    Сообщения:
    9
    (Опять же, если я правильно понял замысел автора...)
     
  15. psh

    psh New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    13
    Ну я скормил этой функции строчку с нулями через push dword[401234] . Тока так можно выдать лишь 2ное слово, а надо 74 слова =) короче надо размер больше(
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ну надо больше - сделай больше.
    Уже полтора десятка постов, а ты всё никак по человечески объяснить не можешь чего тебе надо.
    Показывай кусок кода, и что сделать хочешь.
     
  17. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Человеку нужно в одну ячейку памяти положить 74 дворда. Он спрашивает, как это сделать? Как положить 74 дворда в ячейку памяти, размер которой 1 дворд.
     
  18. psh

    psh New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    13
    intel_x128, я это не спрашиваю, вопрос был по реализации программы. В 8ом посту. У меня щас времени оч мало, вечером посмотрю все предложеные варианты, сам потуплю ещё и выложу код.
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Кул хацкеры однако. Название темы меня испугало и я долго не решался её открыть. ^)
     
  20. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    buff = ("\x00\x00\x00\x90\xff\x53\x4d\x42\x72\x00\x00\x00\x18");
    send(buff);

    Вот тебе дословный перевод, в чём проблема пока не ясно:

    Код (Text):
    1. .data
    2. str_with_zeroes db 00h, 00h, 00hm 90h, 0ffh, 53h, 4dh, 42h, 72h, 00h, 00h, 00h, 18h
    3. .code
    4. push offset str_with_zeroes
    5. call _send
    6. pop eax