Как удалить NULL (00) из машинного кода? - PullRequest
0 голосов
/ 08 декабря 2010

Мне нужно знать, как удалить ноль (00) из машинного кода. я написал код на ассемблере. Успешно работает. Мне нужен вывод без NULL

.data
  Bash:
      .asciz "/bin/hostname"
  Null1:
      .int 0
  AddrToBash:
      .int 0
  NULL2:
      .int 0

  .text
      .globl _start

_start:
       #execute routine

       xor  %eax,%eax
       movl $Bash, AddrToBash
       movl $11,%eax
       movl $Bash,%ebx
       movl $AddrToBash,%ecx
       movl $NULL2,%edx
       int  $0x80

       #exit routine


     Exit:
       movl $10,%ebx
       movl $1,%eax
       int $0x80 

Следующий вывод

4000b0: 31 c0                   xor    %eax,%eax
  4000b2:   c7 04 25 f2 00 60 00    movl   $0x6000e0,0x6000f2
  4000b9:   e0 00 60 00 
  4000bd:   b8 0b 00 00 00          mov    $0xb,%eax
  4000c2:   bb e0 00 60 00          mov    $0x6000e0,%ebx
  4000c7:   b9 f2 00 60 00          mov    $0x6000f2,%ecx
  4000cc:   ba f6 00 60 00          mov    $0x6000f6,%edx
  4000d1:   cd 80                   int    $0x80

00000000004000d3 <Exit>:
  4000d3:   bb 0a 00 00 00          mov    $0xa,%ebx
  4000d8:   b8 01 00 00 00          mov    $0x1,%eax
  4000dd:   cd 80                   int    $0x80

как убрать 00, Я сделал изменения как eax в al, bx в bl blahahahahahaha ...... но не работает может кто-то изменить его .......

Ответы [ 2 ]

3 голосов
/ 24 апреля 2012

Вы должны принять во внимание много вещей, если хотите избежать пустых байтов в шеллкоде.Тем не менее, в большинстве случаев требуется замена инструкций эквивалентными.

Например,

mov $0, %eax

создает b8 00 00 00 00, который содержит NULL-байты.Замена на

xor %eax, %eax

семантически эквивалентна, но вместо этого выдает 31 c0.

Для хорошего ознакомления с написанием шелл-кода прочитайте Сокрушение стека для удовольствия и прибыли ,Книга Взлом: искусство эксплуатации содержит раздел (0x523) о том, как избегать пустых байтов в шелл-коде.

0 голосов
/ 09 декабря 2010

Итак, вы хотите использовать коды операций, которые не содержат байт 0. Это может быть полезно только для создания переполнения буфера со строками (пример: strcpy()).

Либо вы хорошо изучаете ассемблер, чтобы вы знали наизусть двоичную кодировку наиболее распространенных инструкций, таким образом, избегая 0. Или используя для этого существующие инструменты: то, что кодирует исходный код в представление без 0 байт (пример: BCD, base64 или даже строка ASCII, например 010010010), и добавляет к нему специальный дескриптор, не содержащий нулей.

...