Добрый вечер, пробую написать код для вывода сообщения "hello", цель научиться писать эксплойты под linux (да и под всё остальное) Вот код Код (Text): xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx jmp short string code: mov al, 4 mov bl, 1 mov dl, 5 pop ecx int 0x80 dec bl mov al,1 int 0x80 string: call code db "hello" Проблема видимо в call code и последующем pop ecx .. После компиляции nasm hello.asm Запускаю через консоль созданный файл, и получаю это ./hello: line 1: 1�1�1�1����Ỳ�˰̀�����hello: command not found В чём проблема? как поправить?
Код (Text): mov al, 4 mov bl, 1 mov dl, 5 Насколько я помню, для параметров используюся dword'ы. Так что надо: Код (Text): mov eax, 4 mov ebx, 1 mov edx, 5 Предполагаю, что система 32битная.
изменил код на это Код (Text): xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx jmp short string code: mov eax, 4 mov ebx, 1 mov edx, 5 pop ecx int 0x80 dec bl mov al,1 int 0x80 string: call code db "hello" После nasm hello_2.asm $ ./hello_2 bash: ./hello_2: cannot execute binary file =(
А, прошу прощения, не обратил внимания, что старшие разряды регистров чистятся до этого. Тогда не понятно в чем дело.
featurelles Неужели так трудно поисковиком воспользоваться и не задавать вопросы, которые давно уже решены. http://forum.codenet.ru/archive/index.php/t-35175.html
valterg Прочёл всё по данной ссылке, и чем мне тот пост должен был помочь? Мне нужно получить простой бинарник, чтоб потом его считать в буфер, из другой программы и передать на него управление. Как сделать Эт я в курсе)... но надо то мне не использовать section .data ...да и не использовать ld ..и -f elf туплю?
Код программы, через котрую пытаюсь запустить бинарник Код (Text): #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> /* Вывод сообщения */ static void croak(const char *msg) { fprintf(stderr, "%s\n", msg); fflush(stderr); }; /* Вывод справки по использованию */ static void usage(const char *prgnam) { printf("\nExecute code : %s -e <file-containtng-shellcode>\n", prgnam); printf("\nConvert code : %s -p <file-containtng-shellcode>\n", prgnam); fflush(stderr); exit(1); }; /* Выход при ошибке */ static void barf(const char *msg) { perror(msg); exit(1); }; /* Основной код */ int main(int argc, char **argv) { FILE *fp; struct stat sbuf; void *code, (*fptr)(void); int arg, i, l; int m = 15; // максимлаьное количество байтов, выводимых в одной строке long flen; // подразумевается, длина файла 2^32 if(argc < 3) usage(argv[0]); if(stat(argv[2], &sbuf)) barf("failed stat file\n"); flen = (long)sbuf.st_size; if(!(code = malloc(flen))) barf("ошибка выделения памяти\n"); if(!(fp = fopen(argv[2], "rb"))) barf("ошибка открытия файла\n"); if(fread(code, 1, flen, fp) != flen) barf("ошибка чтения файла\n"); if(fclose(fp)) barf("ошибка закрытия файла\n"); while((arg = getopt(argc, argv, "e:p:")) != -1) { switch(arg) { case 'e' : croak("Вызываю код...\n"); fptr = (void (*)(void))code; (*fptr)(); break; case 'p' : printf("\n The following shellcode is %d bytes long: \n", flen); printf("\nchar shellcode[] = \n"); l = m; for(i=0; i<flen; ++i) { if(l>=m) { if(i) printf("\n"); printf("\t"); l=0; }; ++l; printf("\\x%02x", ((unsigned char *)code)[i]); }; printf("\n\n"); break; default: usage(argv[0]); }; }; return 0; }
А мы все это должны по одному слову exsploit угадать и пяти командам. Вот это на фига было делать? Естественно бинарник не запустится. И запутал окончательно. Почему выдало ? Явно ты куда-то залез. Смотри через отладчик gdb как твой "сплойт" отрабатывает.