Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Assembler] Dziwny bug...

Ostatnio zmodyfikowano 2012-07-21 20:14
Autor Wiadomość
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
P-60769
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
Procesor źle liczy? o.O
 Raczej my w swej niewiedzy coś robimy nie tak :D
P-60772
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.
P-60773
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.
P-60779
diego997
» 2012-07-21 19:06:43
@Mrovqa tak z ciekawości po co się uczysz asemblera nie szkoda na to czasu ?
P-60780
m4tx
» 2012-07-21 19:07:55
Znajomość Asma pozwala pisać szybsze (czyli lepsze) aplikacje w innych językach.
P-60781
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.
P-60784
szyx_yankez
» 2012-07-21 20:09:44
Znajomość Asma pozwala pisać szybsze (czyli lepsze) aplikacje w innych językach.
Uzasadnij :D
P-60785
« 1 » 2
  Strona 1 z 2 Następna strona