Как заполнить всю память ?

Тема в разделе "WASM.A&O", создана пользователем Medstrax, 6 июн 2010.

  1. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Гипотетическая ситуация. Пусть все 4 Гб адресного пространства адресуют writeable memory.
    Задача написать код, который заполнит все эти 4 Гб неким однобайтовым значением. Значение по вашему выбору.
    Не забываем, что код тоже находится в этих 4 Гб. Для однобайтового значения я увидел пока только одно решение.
    Для 2-4-байтового решений больше.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    rep stosb?
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    medstrax1
    наврно имелось в виду "всю - код" ?
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    rep stos и rep movs – особые инструкции. Заполнение будет продолжаться даже после перезаписи выполняемого кода в памяти.
     
  5. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    по rep movsb понял, что заполняющая команда может быть > 1 байта.

    мой вариант

    mov eax,90909090h
    mov [eax],0d0ffh
    jmp eax

    такая шутка еще в голову пришла. не одним байтом, но все равно мне чемто
    push 9024048f
    jmp esp
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    qqwe
    Прикольно, но не совсем понятно почему это должно работать. Что будет, когда call затрёт свой же адрес nop-ми?
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    qqwe
    Так вроде должно.
    Код (Text):
    1. mov eax,0h
    2. mov [eax],0d0ffh
    3. jmp eax
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Booster
    ничего не будет. будет выполнять нопы.

    так тоже можно. любую безопасную команду.
     
  9. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Смелое заявление, но, увы, неверное
     
  10. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    затирание нопами не катит, это затрет сам код
     
  11. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    medstrax1
    как можно затереть всю память не затерев сам код? или имеется в виду, что сам код, включая подготовочный, должен состоять из одного байта или из нескольких одинаковых байт? уточните задачу.
     
  12. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    в этом и сложность
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    qqwe
    Так оно дойдёт до адреса 90909090h и пойдёт выполнять нопы, но ниже адреса 90909090h тоже нужно писать.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Код (Text):
    1. cld
    2. mov edi, 1
    3. mov al, 0aah
    4. mov byte ptr[0], al
    5. jmp 0
     
  15. semishift

    semishift Сергей

    Публикаций:
    0
    Регистрация:
    6 фев 2010
    Сообщения:
    6
    Код (Text):
    1.  std
    2.         xor eax, eax
    3.         dec eax
    4.         mov esi, eax
    5.         dec eax
    6.         mov edi, eax
    7.         sub eax, 14
    8.         mov ecx, eax
    9.         not eax
    10.         rep movsb
    11.         movaps xmm0, [eax]
    12.         movaps [ecx], xmm0
    13.         movaps [ecx+1], xmm0
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Код (Text):
    1. cld
    2. mov edi, 1
    3. mov esi, 0
    4. mov al, 0a4h
    5. mov byte ptr[0], al
    6. jmp 0
     
  17. semishift

    semishift Сергей

    Публикаций:
    0
    Регистрация:
    6 фев 2010
    Сообщения:
    6
    наверное так

    Код (Text):
    1. 0x00000000    rep stosd
    2. 0x00000002    std
    3. 0x00000003    mov eax, 90h
    4. 0x00000008    mov edi, -1
    5. 0x0000000d    jmp 0
    ничто не мешает нам, находясь в высших адресах, загрузить в начало этот код и сделать jmp 0x2
     
  18. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    2Booster
    +1
     
  19. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    medstrax1

    :)

    Код (Text):
    1. format PE
    2.  
    3. section '.text' readable writable executable
    4. entry $
    5.     push edi
    6.     xor edx, edx
    7.     mov eax, $42                ; inc edx
    8.     mov ecx, eax                ; bytecount
    9.     call @f
    10.     mov eax, edx
    11.     pop edi
    12.     retn
    13.    
    14. @@:
    15.     lea edi, [$]
    16.     mov byte [edi + ecx], $C3   ; retn
    17.     rep stosb
    18.     nop
    19.     int3
    Код (Text):
    1. C:\Users\xk\Desktop>lolstos & echo !errorlevel!
    2. 54
    (Предполагается, что настройки кэширования подходящие, а во время заполнения не придут прерывания).
     
  20. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    2Sol_Ksacap
    Был не прав, беру слова обратно.