Pytanie:
Konwersja kodu asemblera na c
MLSC
2014-02-24 14:18:37 UTC
view on stackexchange narkive permalink

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?

Wygląda na crackme lub CTF. Więc powinniśmy odrobić twoją pracę domową? :) ... na pewno ktoś to zrobi.
Chodź MortezaLSC, to wszystko skomentowane iw pełni zrozumiałe ... RTFM!
@0xC0000022L Znalazłem to ... dziękuję za pomoc
Cztery odpowiedzi:
pank4j
2014-02-24 14:46:03 UTC
view on stackexchange narkive permalink

Oto lista kilku narzędzi / zasobów do dekompilacji, które mogą okazać się przydatne.

Czy mogę zdekompilować wynik polecenia `as test.s -o test` na kod C (wiersz poleceń)?
To zależy. Jeśli test.s jest generowany za pomocą kompilatora C, takiego jak cl.exe lub gcc, istnieje prawdopodobieństwo, że odzyskasz kod C, który jest zbliżony do oryginału. Jeśli jest to ręcznie wykonany kod asemblera, zdekompilowany kod może nie być przydatny niż sam zestaw.
ok .. używam gcc ... Jak to możliwe? dzięki
Spróbuj otworzyć złożony plik binarny w IDA Pro lub Hopper.
w s
2014-02-24 14:27:45 UTC
view on stackexchange narkive permalink

Potrzebujesz dekompilatora. Skompilowałbym go i użył dekompilatora z możliwością ponownego kierowania. Jest to najłatwiejszy sposób wykonania tego konkretnego zadania.

0xea
2014-02-24 16:34:44 UTC
view on stackexchange narkive permalink

Chciałbym tylko dodać, co faktycznie robi ten kod, ponieważ jest dość prosty. Jest przeznaczony do użytku jako kod szelkowy. Stosunkowo standardowy. To, co robi, to zapisuje coś do AHMADUMinU do STDIN (?), Który jest drukowany na ekranie, a następnie przechodzi do wykonania / bin / sh przez wywołanie systemowe 11. Jest to dość łatwe do naśladowania, ponieważ jest mocno skomentowane. Wspominam o tym wszystkim, ponieważ nie będziesz w stanie zobaczyć wielu szczegółów w „zdekompilowanym kodzie”, który wyglądałby mniej więcej tak:

  main () {write (0, " AHMA ... ", 15); execve (" / bin / sh ", NULL, NULL);}  

Jest jeden interesujący bit (stara sztuczka z kodowaniem szelkowym). Szelkod musi kończyć ciąg „/ bin / sh” na NULL, który będzie gdzieś na stosie. W tym celu musi uzyskać swój adres. Robi to, wykonując dwa telefony. Połączenia utworzą nowe ramki stosu, w którym to momencie może po prostu zdjąć zapisaną ramkę stosu.

Jest również starszy od szelkodu. Wirusy DOS zrobiły to samo i zwykle nazywały to „przesunięciem delta”.
franck
2017-03-19 13:31:29 UTC
view on stackexchange narkive permalink

Istnieje również asm2c, który działa na kodzie źródłowym assemblera zamiast na plikach wykonywalnych lub plikach obiektów.

Narzędzie do konwersji kodu asemblera DOS do kodu C Edycja



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...