Kérdés:
Véletlenszerűen vesz fel egy x86 regisztert egy utasításhoz
Knoob87
2016-06-12 08:53:00 UTC
view on stackexchange narkive permalink

Rátaláltam egy rosszindulatú programra, amelyet elemzek, és megállapítottam, hogy valamilyen matematikával véletlenszerűen kiválaszt egy regisztrációt egy adott utasításhoz.

Amit nem értek, hogy ez a művelet számított miben múlik?

Itt van egy példa arra, amire gondolok

Tegyük fel, hogy véletlenszerűen szerettem volna felvenni egy regisztert az utasításhoz

  DWORD PTR DS HOZZÁADÁSA: [0], EAX  

Úgy tudjuk, hogy az utasítás opkódja 01 05 00 00 00 00

A félkövér szám jelöli az utasítás regisztrációját.

05 == EAX0D == ECX

Ennek jobb megmagyarázásához itt találja az utasítást az összes regiszterrel.

  0041580B 0105 00000000 ADD DWORD PTR DS: [0], EAX00415811 010D 00000000 ADD DWORD PTR DS: [0], ECX00415817 0115 00000000 ADD DWORD PTR DS: [0], EDX0041581D 011D 00000000 EBX00415823 0125 00000000 DWORD PTR DS ADD: [0], ESP00415829 012D 00000000 DWORD PTR DS ADD: [0], EBP0041582F 0135 00000000 ADD DWORD PTR DS: [0], ESI00415835 013D 00000000 ADD DWORD PTR DS: [0], EDI  

A kártevő 0 (EAX) és 7 ( EDI)

A szám előbb SHLed lesz a 3-as számmal, majd VAGY 5-tel van a megfelelő regiszter opkód megszerzéséhez. Tehát a kérdésem az, hogy a szerző hogyan jutott erre?

Azt mondanám, hogy az SHL REG, 3 megegyezik a REG * 8-mal, vagyis a max regiszterek számával? de miért kell VAGYUNK 05-tel? azért van, mert ennek az utasításnak a kezdő opkódja 05?

Van valakinek jobb magyarázata erre? vagy bármilyen tippszó a jobb megértés érdekében?

Egy válasz:
0xec
2016-06-12 13:54:57 UTC
view on stackexchange narkive permalink

Ennek jobb megértéséhez tanulmányoznia kell az utasítás kódolásának formátumait, azaz az x86-ot ehhez a kérdéshez.

Az x86 utasítás így néz ki

  + ----- ----------------- + -------- + -------- + ----- + -------- ------ + ----------- + | Utasítás előtagok | Opcode | ModR / M | SIB | Elmozdulás | Azonnali | + ---------------------- + -------- + -------- + ----- + -------------- + ----------- + | 0-4 | 1-3 | 0-1 | 0-1 | 0-4 | 0-4 | + ---------------------- + -------- + -------- + ---- - + -------------- + ----------- +  

A második sor számai a hosszúságot jelzik a megfelelő rész bájtjai.

Az utasításhoz

  010D 00000000 ADD DWORD PTR DS: [0], ECX  

nincs utasítás előtag. A ADD opcode 01 ( Ellenőrizze itt)

Az utasítás második bájtja azaz a ModR / M értéke 0D . A ModR / M bájt címzési információkat ad az utasításról. Megadja, hogy az operandus regiszterben vagy memóriában van-e; ha a memóriában van, akkor a bájt mezői meghatározzák a használni kívánt címzési módot.

A ModR / M bájtot fel lehet bontani

  + ----- + ------------ + ----- + | Mod | Reg / Opcode | R / M | + ----- + ------------ + ----- + | 2 | 3 | 3 | + ----- + ------------ + ----- +  

Itt a második sor számai jelzik a hosszúságot a megfelelő részek bitjei.

A Mod mező (2 bit) a R / M mezővel (3 bit) kombinálva 32 lehetséges értéket alkot. 8 regiszter és 24 címzési mód.

A Reg / Opcode mező (3 bit) vagy regisztrációs számot, vagy további három bit opcom információt határoz meg; a r / m mező (3 bit) megadhat egy regisztert operandus helyeként, vagy része lehet a címzési módú kódolásnak a Mod -val kombinálva. mező.

Most konvertálja a ModR / M -t, azaz a 0D -ot binárisra. Megkapná.

  + ----- + ------------ + ----- + | Mod | Reg / Opcode | R / M | + ----- + ------------ + ----- + | 00 | 001 | 101 | + ----- + ------------ + ----- +  

A Mod és R / M mezők 00 és 101 . Ez csak az elmozdulás címzési módját jelzi. Lásd az alábbi táblázatot.

enter image description here

Az összes utasításhoz ezt a címzési módot használja, ezért a oka VAGY 5-el (bináris 101-ben) az adott bitminta beállításához.

A Reg / Opcode mezőbe érve ez egy regisztert jelez .
A 001 az ECX regiszter indexe.

Az első utasításhoz, azaz
0105 00000000 ADD DWORD PTR DS: [0], EAX
ez a mező 000 áll EAX . Ellenőrizheti, ha a 05 fájlt binárisra konvertálja.

További információ az alábbi táblázatban található: itt.

enter image description here

Tehát alapvetően a regiszter értékét SHL szerkesztették 3-mal, hogy a megfelelő pozícióba vigye. A Reg / Opcode mező 3 bit jobbra.

Végül az utolsó 4 bájt a 00000000 . Ez a nulla elmozdulást jelenti ebben a példában.



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...