2013-03-06 2 views
1

Я хочу, чтобы отобразить мир привета от шеллкода с кодом прост:бесконечный цикла в шеллкоде

#include <stdio.h> 

char shellcode[] = "\xeb\x17\x59\x31\xc0\xb0\x04\x31\xdb\x43\x31\xd2\xb2\x0f\xcd\x80\xb0\x01\xbb\x00\x00\x00\x00\xcd\x80\xe8\xe4\xff\xff\xff\x48\x65\x6c\x6c\x6f\x20\x73\x68\x65\x6c\x6c\x21\x0a\x0d"; 

int main(int argc, char **argv){ 

int (*func)(); 

func = (int (*)()) shellcode; 

(int)(*func)(); 

return 0; 
} 

проблема должна быть в файле сборка, здесь:

BITS 32 
jmp short one 

;write hello world on standard output 
two: 
pop ecx ;i get string address 
xor eax,eax 
mov al,4 
xor ebx,ebx 
inc bl ;bl should be 1 
xor edx,edx 
mov dl,15 
int 0x80 

;exit with status 0 
mov al,1 
xor ebx,ebx 
int 0x80 

one: 
call two 
db "Hello shell!",0x0a,0x0d 

код работает хорошо, но не выходит после отображения «hello shell!», напротив, он продолжает отображать это предложение, как в бесконечном цикле.

+0

Я не эксперта по 'Int 0x80', но вы уверены, что первый системный вызов не затирать верхний 24 бита' eax' (которые имеют быть нулевым для второго syscall)? – NPE

ответ

4

Кажется, что первый int 0x80 возвращает возвращаемое значение в eax. После этого вы установили al в 1, но не eax.

Таким образом, вы должны изменить свой код:

mov eax,1 
xor ebx,ebx 
int 0x80 
+0

Ваш .asm-файл говорит «xor ebx, ebx', но ваш файл C говорит« mov ebx, 0'. Просто sayin '... –

+0

'mov eax, 1' не является хорошим шеллкодом (как не' mov ebx, 0') из-за встроенных нулей в (32bit-) константе. 'xor reg, reg', за которым следует' inc reg' или 'add' /' mov', до 8-битного регистра не будет содержать нулей в коде операции. –

 Смежные вопросы

  • Нет связанных вопросов^_^