Mrovqa Temat założony przez niniejszego użytkownika |
[Assembler] Dziwny bug... » 2012-07-21 16:39:58 Witam, mam jakiś dziwny bug... gdy kopiuję coś ze stosu do rejestru, to w pewnym momencie rejestr edi przyjmuje wartość o 12 mniejszą... (gdb) x/10i $eip 0x3c0185: mov edi,DWORD PTR [ebp-0x8] <-- jesteśmy tu 0x3c0188: call 0x3c0171 0x3c018d: mov ecx,eax 0x3c018f: mov edx,eax 0x3c0191: mov eax,DWORD PTR [ebp-0xc] 0x3c0194: mov edi,DWORD PTR [ebp-0x8] 0x3c0197: cld 0x3c0198: repnz scas al,BYTE PTR es:[edi] 0x3c019a: test ecx,ecx 0x3c019c: je 0x3c01a9 (gdb) x/10x $esp 0x28fd98: 0x0028feac 0x003c0137 0x0028fdac (<-- ta wartość ma być skopiowana) 0x00000073 0x28fda8: 0x00000073 0x66647361 0x00000000 0x0028fdec 0x28fdb8: 0x76b4f287 0x76b4f28f (gdb) ni <-- wykonujemy instrukcję... 0x003c0188 in ?? () (gdb) print /x $edi $8 = 0x28fda0 <--- i wypisując mamy złą wartość o.O !! (gdb) Dodam, że ebp wskazuje na to samo co esp. O co z tym chodzi? Procesor źle liczy? o.O |
|
Drraven |
» 2012-07-21 16:50:57 Są jeszcze dwa rejestry indeksowe (EDI (rejestr przeznaczenia) i ESI (rejestr źródła)), które dzielą się na DI i SI. Używa się ich do operacji na łańcuchach (np. na tekście). ESI przechowuje źródło (ang. Source), a EDI miejsce docelowe (ang. Destination). EBP (wskaźnik bazowy) i ESP (wskaźnik stosu) to natomiast rejestry wskaźnikowe pierwszy z nich służy do adresowania, drugi przechowuje wskaźnik wierzchołka stosu. Źródło |
EDI – Destination Index (rejestr przeznaczenia - przetrzymuje informacje o miejscu docelowym łańcucha danych)
Źródło |
mov eax, "0" mov ebx, nasze_flagi; EBX = adres bufora dla wartości flag xor edi, edi ; EDI = 0 [...] mov [ebx+edi], al ; zapisz AL w buforze add edi, 1
Tu mu działa to :) Źródło Raczej my w swej niewiedzy coś robimy nie tak :D |
|
Mrovqa Temat założony przez niniejszego użytkownika |
» 2012-07-21 17:18:23 Reszta kodu z kopiowaniem do edi mi działa, ale w takim jednym miejscu źle kopiuje... Kompilowałem to wielokrotnie i debuggowałem by się upewnić - i nadal bug jest... Mogę tu zamieścić cały kod, ale nie wiem, komu by się chciało to wszystko czytać i interpretować... ale macie: [bits 32]
mov ebp, esp sub esp, 0x104
; wczytanie ; scanf("%s %c",ebp-0x100, ebp-0x104) lea eax, [ebp-0x104] push eax add eax, 4 push eax
call fmt db "%s %c", 0 fmt: call [ebx+4*4] add esp, 12
; wywolanie mov eax, [ebp-0x104] push eax lea eax, [ebp-0x100] push eax call strchr
; wypis mov edx, [ebp-0x104] push edx lea edx, [ebp-0x100] push edx push eax mov edi, edx ; [ebp-0x100] call strlen push eax call fmt2 db "wynik: %i %s %s %c", 0xa, 0 fmt2: call [ebx+3*4] add esp, 0x14
; koniec push 0 call [ebx] ; exit
; strlen(char*) fastcall ; edi - bufor (parametr) ; eax - zwracana wartość strlen: mov al, 0 xor ecx, ecx ; 0 not ecx ; 0xFFFFFFFF cld repne scasb xor eax, eax not eax sub eax, ecx dec eax ret ; strchr(char*,char) stdcall ; eax - zwracana wartość strchr: push ebp mov ebp, esp ; zmienne lokalne ? ; [old_ebp][ret][src_ptr][char_to_find] ; ^ 0 ^ -4 ^ -8 ^ -12 mov edi, [ebp-8] ; <-- tu jest bug call strlen mov ecx, eax ; okreslamy liczbe obiegu petli dlugoscia stringu mov edx, eax ; dlugosc zapisuje na pozniej mov eax, [ebp-12] ; okreslamy szukany znak (ostatni bajt z parametru) mov edi, [ebp-8] cld repne scasb test ecx, ecx jz nf ; not found sub edx, ecx lea eax, [ebp-8] ; wyliczenie wskaznika add eax, ecx nf2: leave retn 8 nf: xor eax, eax jmp nf2
//kompilowane nasmem, wykonywane przy pomocy asmloadera gyna, debuggowane przy pomocy gdb. |
|
Elaine |
» 2012-07-21 18:52:57 Jeśli tworzysz typową ramkę stostu ze wskaźnikiem ramki*, to argumenty są na dodatnich offsetach od EBP.
* Tylko po co? To niewiele ułatwia (nie musisz śledzić zmian ESP), a bez tego masz jeden wolny rejestr więcej. |
|
diego997 |
» 2012-07-21 19:06:43 @Mrovqa tak z ciekawości po co się uczysz asemblera nie szkoda na to czasu ? |
|
m4tx |
» 2012-07-21 19:07:55 Znajomość Asma pozwala pisać szybsze (czyli lepsze) aplikacje w innych językach. |
|
Mrovqa Temat założony przez niniejszego użytkownika |
» 2012-07-21 20:06:36 @Iname dzięki. Zapomniałem sobie o tym całkowicie :/
Asma nie uczę się dla wstawek (choć to zaleta) tylko dla RE i z ciekawości ;) Dowiesz się, jak aplikacje działają niskopoziomowo. |
|
szyx_yankez |
» 2012-07-21 20:09:44 Znajomość Asma pozwala pisać szybsze (czyli lepsze) aplikacje w innych językach. |
Uzasadnij :D |
|
« 1 » 2 |