Исключить ошибку сегментации записи в shellcode

Я пытаюсь изучить shell-код execve,

ОС: Linux bt 2.6.39.4

root @ bt: ~ / exploit # cat gshell.s

.globl _start _start: nop jmp MyString shell: popl %esi xorl %eax,%eax movl %al,9(%esi) movl %esi,10(%esi) movl %eax,14(%esi) movb $11,%al movl %esi, %ebx leal 0xa(%esi),%ecx leal 0xe(%esi),%edx int $0x80 movl $1,%eax movl $0,%ebx int $0x80 MyString: call shell shellvar: .ascii "/bin/bashADDDDCCCC" 

root @ bt: ~ / exploit # as -gstabs -o gshell.o gshell.s

root @ bt: ~ / exploit # ld -o gshell gshell.o

root @ bt: ~ / exploit # ./gshell Ошибка сегментации (kernel сбрасывается) root @ bt: ~ / exploit #

GDB:

(gdb) break * _start Точка останова 1 на 0x8048054: файл gshell.s, строка 6.

(gdb) r Запуск программы: / root / exploit / gshell

Программный сигнал SIGSEGV, segmentation fault. shell () в gshell.s: 14 14 movb% al, 9 (% esi)

(gdb) print / x $ esi $ 1 = 0x804807a (gdb) x / 16cb $ esi 0x804807a: 47 ‘/’ 98 ‘b’ 105 ‘i’ 110 ‘n’ 47 ‘/’ 98 ‘b’ 97 ‘a’ 115 ‘s’ 0x8048082: 104 ‘h’ 65 ‘A’ 68 ‘D’ 68 ‘D’ 68 ‘D’ 68 ‘D’ 67 ‘C’ 67 ‘C’ (gdb)

из вышестоящего вывода кажется, что я успешно использовал pope’d / bin / sh адрес в регистре ESI. Но когда я пытаюсь переместить 0 в 9 (% esi) ->, он вызывает ошибку сегментации. Даже попытался изменить эту программу: movl от $ 0 до $ esi. Хотите знать, ограничено ли писать по адресу 0x804807a? которые вызывают эту ошибку? и как я могу продолжить успешное выполнение этого shellcode

Спасибо, малыш

    Как сказал Бо в своем комментарии, раздел .text по умолчанию .text только для чтения по текущим системам. Чтобы этот код работал, вы должны сделать его доступным для записи. Например, вы можете использовать директиву в исходном файле так:

     .section wtext, "awx", @progbits 

    Эквивалентная директива nasm :

     section wtext exec write 

    В качестве альтернативы, можно также передать ключ -N в компоновщик.

    Обратите внимание, что такой код оболочки обычно предназначен для выполнения стека, что является еще одной вещью, которая обычно отключается в текущих операционных системах. Если вы когда-нибудь захотите попробовать это в стеке, вам может понадобиться опция -z execstack linker.

    Interesting Posts

    Какие лицензии с открытым исходным кодом совместимы с iPhone Apple и его официальным магазином приложений?

    JqGrid нужна гиперссылка – нужно захватить ценность через JQuery

    Почему мой монитор показывает, что поблекшие черные линии движутся повсюду?

    Невозможно импортировать ключевой файл «blah.pfx» – ошибка «Ключ-файл может быть защищен паролем»

    Что должен знать человек, прежде чем собирать свой первый компьютер?

    Как использовать весеннюю транзакцию в многопоточном режиме

    Будет ли эта стратегия работать с Windows 10?

    Есть ли более быстрый способ открыть процесс как администратор (с включенным UAC)?

    Tcpdump promiscuous mode на OSX 10.8

    «Панический пароль» в Linux

    Можно ли фильтровать адреса в поле CC, но не в поле TO?

    Excel: сочетание клавиш для перемещения (своп) столбца влево или вправо?

    Разделение на Java всегда приводит к нулю (0)?

    Как использовать jQuery для события click в веб-приложении iPhone

    Проводная память против активной памяти в OS X

    Давайте будем гением компьютера.