Сборный / Говнокод #78 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
nop
nop
nop
call somelabel
somelabel:
pop si
sub si, 3

ассемблер - источник массы говнокода, классика...

Запостил: guest guest, (Updated )

Комментарии (27) RSS

  • Destman:
    Вполне такой нормальный код 🙂
    Зачемто понадобился адрес 4-й команды (может данные какиенить в сегменте cs лежат, али еще чего такого темного понадобилось сделать).
    А нопы - это либо выравнивание, либо остаток от предыдущей комманды (однопроходные компиляторы часто имеют такую особенность, что если пыргаеш вперед по коду (компилятор не знает сколько там байтов впереди) то резервируется место для команды с длинным переходом, потом когда метка куда прыгать всплывает - компилятор уже вставляет нужный вариант перехода и если осталось место - оно все в нопах 🙂 )
    Ответить
    • Ну если это выхлоп компилятора, а не ручное творечтво, то смеяться не над чем
      Ответить
  • Destman:
    Не ну наглеж. Все языки как языки а ассемблер с маленькой буквы 🙂
    Ответить
  • гм, просто пропатчили чтото, вот и гавнакод вышел;)
    Ответить
  • Dr.Freez:
    А чо) ... этаж асм...пишешь пишешь, накидаешь 20 строк кода а потом нахрен их)...вот и остаются такие ляпы)
    Ответить
  • Бармалейкин:
    Собственно, слово «ассемблер» это не название конкретного языка программирования (типа Фортран, Форт, Паскаль, Пролог, Си или Java), а просто слово английского технического языка, обозначающее процесс трансляции неких команд в исполняемый код. Потому писать его можно с любой буквы. Дело привычки.
    Ответить
  • nobodyzzz:
    вполне нормальный код. попробуйте погуглить про базонезависимый код.
    Ответить
  • Mike:
    Ну, nop зачем не знаю, а дальше получение смещения для проги, которая будет висеть по неизвестным адресам в памяти. Нормально. Например для вируса.
    Ответить
  • Mike:
    Кстати, пример вырванного из контекста кода. Если бы дали строчки 8,9,10 - было бы понятно. И скорее всего не исходник, а дизассемблированный листинг, так как строка 4 должна выглядеть как

    BaseAddress:
    call somelabel
    Потом в SI смещение правильное.

    Вообщето, действительно говнокод, так как можно было бы переименовать somelabel в BaseAddress и не городить sub si,3

    Когдато сам писал такой код, когда еще были .com файлы, в начале 3 байта jmp на то что аттачнул к файлу, а потом уже все остальное :))
    Ответить
  • Archaron:
    NOP - задержка, никто не писал для микроконтроллеров разве?
    Ответить
  • Mike:
    Под х86 обычно юзали прерывания BIOS или DOS, непосредственно до оборудования через in/out редко преходилось, поэтому особой надобности в задержках небыло. Только если контроллеру прерывний что сказать. :)) Код, видно по:
    pop si
    sub si , 3
    16-битный, так что сейчас обсуждаем MS-DOS.
    Ответить
  • Destman:
    Ну код может быть и 32 и 64 битным 🙂
    Это только часть кода, и тут работа идет максимум с 16 битными операндами...

    З.Ы. Я такую конструкцию тоже юзал както, в перехватчике винапи вызвов (для дебаговых целей мониторил адрес функции которую перехватил)
    Ответить
  • Нормально. В «Линуксе» такое используется для position-independent code. В «DOS» такой же приём использовали вирусы.
    Ответить
    • Вот вам не большой список проверенных Магазинов которые ведут продажи через телеграм!
      Все вы их знаете по Рампу или Hydra! https://pastebin.com/JWcx7p64

      STUFF MAN:
      Телеграм магазина @MAN_STUFF (https://t.me/MAN_STUFF)

      XTC Market: №1 в РФ
      Телеграм магазина @XTC_24 (https://t.me/XTC_24)

      WDС USA SHOP
      Телеграм магазина @U_S_A_SHOP (https://t.me/U_S_A_SHOP)

      Prazdn1k
      Телеграм магазина @Prazdn1kmsk (https://t.me/Prazdn1kmsk)

      [ЦУМ]
      Телеграм магазина @Tsum_msk (https://t.me/Tsum_msk)

      [КОНТРАБАНДА]
      Телеграм магазина @kontrabanda24 (https://t.me/kontrabanda24)

      Ant1biotik Shop
      Телеграм магазина @Ant1biotik_24 (https://t.me/Ant1biotik_24)

      Магазин Адская Лавка
      Телеграм магазина @hellish_shop (https://t.me/hellish_shop)
      __________________
      Ответить
    • PIC же это когда смешение добавляется к регистру, и оно патчится, не?
      Ответить
      • «PIC» — это когда код не зависит от адреса, по которому он загружен. Основная проблема — доступ к данным: в «x86» можно было загружать данные только по абсолютным адресам (ну, абсолютным базам), поэтому приходилось делать разные трюки. В частности, один из них приведён в ОП-посте:
        jmp start
        db_start:    ; Данные
        db 'Hello World', 0
        
        start:
        call get_ip
        get_ip:
        pop eax     ; Теперь в eax находится реальный адрес 'get_ip'
        sub eax, (get_ip - db_start)    ; Свинтаксис забыл
        push eax
        call puts

        А в «x86_64» завезли «RIP-relative» адресацию, и такие трюки стали нинужны.
        Ответить
        • Да, так понятно. Мне казалось, что там всегда добавляется регистр, и в нем указывается смещение: очевидно, я спутал с RIP
          Ответить
        • Кстати за call + pop защита от нарушения control flow потихоньку начинает пиздить по яйцам. Как и за push + ret.
          Ответить
          • Ага, пару лет назад читал интересную статейку на тему нахождения таких паттернов в коде для противостояния всяческим RCE.
            Ответить
          • Кстати, control flow можно исправить:
            mp start
            db_start:    ; Данные
            db 'Hello World', 0
            
            start:
            call get_ip
            loopa:
            jmp zaloopa
            get_ip:
            mov ebx, esp
            mov eax, [ebx]     ; Теперь в eax находится реальный адрес 'loopa'
            ret
            zaloopa:
            sub eax, (loopa - db_start)    ; Свинтаксис забыл
            push eax
            call puts
            Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8