• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LITTLELIAssembler
    EUR0
    EUR0 --- ---
    MASCA: len jedna chybicka je tam myslim
    pre moznost (c):

    or ax,ax
    jz else ........... nie jnz
    inc dx
    EUR0
    EUR0 --- ---
    MASCA: dakujem pekne! :) sa len zaciname ucit na skole teraz, takze som fakt nemal predstavu, ako by sa to dalo riesit. a teraz pozeram, ze to cez ake vychytavky sa robi :O no, snad to budem vediet pouzit aj v praxi a dostanem nejake tie body za pisomku ;)
    MASCA
    MASCA --- ---
    EUR0: Nostalgie... Tak já to vykopnu, abych to trochu ožilo. Už je to fakt léta, co jsem to viděl naposledy, tak mě klidně rozsekejte :)
        mov si,pole
        mov cx,10
        xor dx,dx
    cykl:
        lodsw
        (X)
    else:
        loop cykl
        mov [v4],dx
    kde na místo (X) patří buď
        cmp ax,dx
        (a) jb else (d) ja else
        mov dx,ax
    nebo
        (b) and ax,1 (c) or ax,ax
        jnz else
        inc dx
    EUR0
    EUR0 --- ---
    vidim, ze tu je mrtvo, ale tak mohol by sa najst nejaky dobrak, co by mi pomohol prosiiim :)

    znenie
    "doplnte instrukce tak, aby po skonceni programu na adrese v4 bylo:
    a) nejvetsi cislo pole cisel BZ
    b) pocet sudych cisel pole
    c) pocet nenulovych cisel pole
    d) nejmensi cislo pole cisel BZ"

    ...
    mov si, pole
    mov cx, 10
    .
    .
    .
    loop cykl
    ...
    pole resw 10
    v4 resw 1
    WENCA
    WENCA --- ---
    WENCA: Ah, takze dekuju ID Dark_one. Bod 10 ve FAQ na tom odkazu...
    WENCA
    WENCA --- ---
    Jsem si chtel vyzkouset nejakej shell code, toz jsem postupoval presne podle tohoto: http://www.vividmachines.com/shellcode/shellcode.html#linex2

    Jenze vzdycky kdyz hodim ten kod do shellcode.c, zkompiluju (gcc -o shellcode shellcode.c) a spustim tak to na me vyrve: Neoprávněný přístup do paměti (SIGSEGV).

    Cim to muze byt?
    LITTLELI
    LITTLELI --- ---
    Nove procesory Intelu obsahuji bezpecnostni bugy
    http://undeadly.org/cgi?action=article&sid=20070630105416
    TREKIE
    TREKIE --- ---
    jsem tam opravil preklep... takze LITTLELI reaguje na TREKIE. tech iteraci je tolik, na kterym miste je nejvyznamnejsi 1 bit... tedy v obecnem pripade 32 pro 32 bitovy registry
    TREKIE
    TREKIE --- ---
    uz vim, jak na to... pocita se treba ebx x edx, vysledek je v edx:eax, ecx se muze klidne pouzit na pocitani cyklu (32 iteraci). eax se vynuluje, edx:eax se rotuje doleva a podle carry se pricita do edx:eax ebx.
    LITTLELI
    LITTLELI --- ---
    no tech iteraci muze byt tolik, kolik je vyznamnych jednickovych bitu tedy max. 32. spis mene .)
    LITTLELI
    LITTLELI --- ---
    jo oni prave jsou ruzny finty, jak vysetrit registry, ale je taky fakt, ze clovek to v hlave moc nenosi. se kajicne priznam, ze sem na asm nesahl roky zase.
    TREKIE
    TREKIE --- ---
    flags se samozrejme pouzivat muze (hlavne kvuli cs), tusim, ze je tam nejaky zcela custom bit. ale to, co tady zatim je, je porad klasicka implementace. na jedny prednasce na mff (principy pocitacu, kdo zna, ten vi) bylo i nasobeni, kdy se to, co se pricita a to, kdy se to ma pricist, rotovalo ve 2 registrech, snad bych se na to mel podivat. jen si pak nejsem jistej, jestli na to neni potreba nejaka maska...
    LITTLELI
    LITTLELI --- ---
    FUXOFT: ono je 1, mam tam ten inc. ale diky za upozorneni.
    LITTLELI
    LITTLELI --- ---
    LITTLELI: s/pushf/pusfd/ a s/popf/popfd

    TREKIE: hm no zasobnik je zasobnik, fakt je, ze pri ukladani na zasobnik se deje par veci. ja se na to podivam zase vecer, trebas jeste na neco prijdu. fakt, je ze to tak jako tak bude vychazet ze stejneho algoritmu, kterym nasobi i clovek (trebas na papire), akorat ze to bude postavene na dvojkove bazi.

    jinak pokud se to bere az tak vazne, tak FLAGS je taky registr, predpokladam ze ten se do toho celkoveho poctu registru nepocita :)
    FUXOFT
    FUXOFT --- ---
    TREKIE: No jde jenom o to, schovat si na chvili nekam hodnotu carry flagu. Nebo to jde i bez toho a pokud ten carry bude 1, tak skocis nekam na konec a tam udelas rucne to posledni pricteni.


    LITTLELI: Pozor, v eax musi byt na zacatku 1, ne 0! To je ten vtip.
    TREKIE
    TREKIE --- ---
    diky za napad, ale mam takovy pocit, ze ten zasobnik funguje jako dalsi registr. prece to musi jit uplne bez nej, ne?
    LITTLELI
    LITTLELI --- ---
    FUXOFT: no maji, dokonce je tam instrukce pro rotaci dvojici 32bitovych registru.. ktera klidne muze nahradit ty dva prvni bitshifty... shld eax,ebx,1. myslis tedy takhle?

    	xor   eax,eax
    	xor   ebx,ebx
    	inc   eax
    loop:   shld  eax,ebx,1
            pushf
    	shl   ecx,1
            jnc   nc
            add   ebx,edx
            add   eax,byte 0
    nc:     popf
            jnc   loop
    

    bez zaruky
    FUXOFT
    FUXOFT --- ---
    TREKIE: Naposled jsem v assembleru delal na ZX Spectru,
    tak to napisu v takovem hodne pseudokodu. Doufam, ze ty dnesni procesory
    tyhle instrukce maji :) loop probehne 32krat.

    ; vynasobi ecx * edx, vysledek da do eax (vyssich 32 bitu) a ebx (nizsich 32)
    
            eax = 1
            ebx = 0
    loop:   bitshift ebx doleva s pretecenim do carry
            bitshift eax doleva, pricemz do praveho bitu "vtece" aktualni carry a levy bit pretece do carry
            push flagy
            bitshift ecx doleva s pretecenim do carry
            pokud neni carry, skoc na nc:
            pricti edx k ebx (coz patricne nastavi carry)
            pricti carry k eax
    nc:     pop flagy
            pokud neni carry, skoc na loop:
            END
    
    TREKIE
    TREKIE --- ---
    jo, zapomnel jsem pridat, ze to nesmi byt stupidni n*pricitani, tzn ze to musi mit linearni slozitost vzhledem k poctu bitu...
    Kliknutím sem můžete změnit nastavení reklam