Сборный / Говнокод #7

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
0100 push si           ; V   ; в DOS обычно SI=100h (но полагаться на это нельзя)
                             ; в debug.com SI=0, поэтому отладить не получится
0101 pop  dx           ; Z   ; dx = 100h <- адрес строки для функции 9 DOS равен образу самой программы
0102 dec  si           ; N   ; si = 0ffh
0103 dec  si           ; N   ; si = 0feh
0104 pop  ax           ; X   ; ax = 0
0105 push ax           ; P   ;
0106 dec  ax           ; H   ; ax = 0ffffh
0107 xor  ax, 3535h    ; 555 ; ax = 0cacah
010A aaa               ; 7   ; поскольку a>9, прибавляем 6 к al и 1 к ah; очищаем старшую тетраду al
                             ; ax = 0cb00h
010B xor  ax, 4B30h    ; 50K ; ax = 08030h
010E xor  al, 50h      ; 4P  ; ax = 08060h
0110 push ax           ; P   ; в стек 08060h
0111 xor  ax, 4D44h    ; 5DM ; ax = 0cd24h
0114 xor  ax, [si+30h] ; 3D0 ; ax = 0cd24h + мусор
0117 xor  [si+30h], ax ; 1D0 ; [12eh] = 0сd24h
011A pop  ax           ; X   ; ax = 08060h
011B xor  ax, 4341h    ; 5AC ; ax = 0c321h
011E xor  ax, [si+32h] ; 3D2 ; ax = 0c321h + мусор
0121 xor  [si+32h], ax ; 1D2 ; [130h] = 0c321h
0124 pop  ax           ; X   ; ax = 0
0125 push ax           ; P
0126 xor  ax, 3935h    ; 559 ; ax = 3935h
0129 xor  ax, 3035h    ; 550 ; ax = 900h
012C dec  bx           ; K   ;
012D xor  al, 20h      ; 4
; после самомодификации (после xor ax, [si+30h] и xor [si+32h], ax)
012D xor  al, 24h      ; 4$  ; $ — конец строки для функции 9 DOS
                             ; просто безобидная инструкция, потому что значение al не важно
012F int  21h          ;
0131 ret               ;

Куайн в виде COM-файла для DOS.

VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP559550K4

Последний символ — пробел.

Запостил: hasOwnProperty hasOwnProperty,

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

  • В чём говно:
    1. Полагаемся на то, что si=100h при старте программы.
    2. Накладываем в три (четыре?) байта за концом программы.

    Второй пункт можно поправить, нафигачив в конец три-четыре пробела. Но тогда это не совсем чистый куайн: финальные пробелы мы же не печатаем.
    Ответить
  • > Накладываем в три (четыре?) байта за концом программы.
    COM-поргамме доступен весь сегмент и всё что за ним, так можно.

    ЗЫ. А чо понельку с ббкодами убрали?
    Ответить
    • Почти так, но не совсем. COM-программе доступна память, округлённая до параграфа (16 байт). Т. е. если COM-файл имеет длину 46 байт, то доступно 48.

      За программой обычно следует стек. Поскольку стек растёт вниз, то есть шанс, что какой-то кусок стека, смежный с программой, никогда не будет использован. Но надеяться на это --- прогулка по тонкому льду, прогулка по минному полю.
      Ответить
    • > ЗЫ. А чо понельку с ббкодами убрали?

      Не убирал. Если знаешь как повторить баг - скажи.
      Ответить

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

Помни, guest, за тобой могут следить!

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


    8