Tråd bedømmelse:
  • 0 Stemmer - 0 Gennemsnit
  • 1
  • 2
  • 3
  • 4
  • 5
Anti-disassembly eksempel fra udfordring
21-05-2016, 22:20 (Denne besked var sidst ændret: 04-02-2017, 12:46 af iTick. Årsag: Stavefejl rettet )
#1
Anti-disassembly eksempel fra udfordring
Dette er assembly/level 7 koden til August 2015 - Levelbaseret skattejagt
Når koden er assembleret og evt. linket hvis man har lyst til det, snyder det mange disassemblers.
Årsagen er den byte der er angivet i junk delen. Det er bare en (velvalgt) byte, som kunne være tekst eller andet. Det er ikke en opcode.
Det tror disassemblers, fordi der er en jump til den byte junk. Så disassemblers tror den skal starte med at disassemble der fra, hvilket forrykker alle opcodes her efter. Det jump der er til den junk byte, bliver aldrig kaldt, da sammenligningen der påvirker dette jump, altid giver det samme resultat, og er der kun for at snyde disassemblers.
For at undgå faste adresser, bruges eax som en placeholder, når der jumpes til de rigtige opcodes i "ok" sektionen. Det kan nemlig også fortælle en disassembler, at det er den rigtige start af koden.

confusion.asm:
BITS 32
GLOBAL _start   ; Entry point for ELF linker
DEFAULT REL
SECTION .text   ; Code block.
_start:
        nop                                             ; Bare for at gøre GDB glad

        mov             eax, 2
        cmp             eax, 3                  ; Lav en sammenligning med 2 og 3, der aldrig bliver ens. OBS: CMP er bare en sub instruktion der ikke gemmer resultatet. Så JE/JZ er sådan set det samme
        je              junk                    ; Et jump vi aldrig tager, men som snyder disassemblers til at tro at det der er under junk, rent faktisk er kode
        mov             eax, ok                 ; Flyt adressen til den rigtige opcode i eax for at undgå at disassemblers opdager det rigtige offset for, hvor koden rigtigt starter
        jmp             short eax               ; Spring over vores junk byte
junk:
        db      0xd8                            ; Junk byte, vi vil have disassemblers til at tro, er en opcode
ok:
        xor             eax, eax                ; Put 0 i eax. Mest for at gøre resultatet mere synlig og man ikke får klippet for meget, når man paster løsningen ind på websiden
        push    eax                             ; Push 0'et der er i EAX på stacken
        mov             ebx, 0x999a9a9e ; Push den ene del af koden i ebx
        neg             ebx                             ; Negate EBX
        push    ebx                             ; Put den ene del af koden på stacken, hvor den skal findes
        mov             ebx, 0x9b9e9a9c ; Put anden del af koden i EBX
        neg             ebx                             ; Negate EBX
        push    ebx                             ; Put anden del af koden på stacken
        nop                                             ; Jeg er flink ved stepi selv om denne slet ikke behøver være her.
        int3                                    ; Break. En gave fra mig til din debugger

Om ikke andet, kan i da lege med det. Koden er her et sted. ;)

Jeg har brugt nedenstående bash script til at compile med: (Man behøver ikke linke)
#!/bin/bash
nasm -f elf32 ./confusion.asm -o ./confusion.o -g
ld -o ./confusion ./confusion.o -melf_i386
strip --strip-all ./confusion
objdump -d  -M intel ./confusion

Når man kører dette script, kan man se objdumps fortolkning af disse opcodes. Man kan se, objdump ikke viser den oprindelige assembly:
08048060 <.text>:
8048060:       90                      nop
8048061:       b8 02 00 00 00          mov    eax,0x2
8048066:       83 f8 03                cmp    eax,0x3
8048069:       74 07                   je     0x8048072
804806b:       b8 73 80 04 08          mov    eax,0x8048073
8048070:       ff e0                   jmp    eax
8048072:       d8 31                   fdiv   DWORD PTR [ecx]
8048074:       c0 50 bb 9e             rcl    BYTE PTR [eax-0x45],0x9e
8048078:       9a 9a 99 f7 db 53 bb    call   0xbb53:0xdbf7999a
804807f:       9c                      pushf
8048080:       9a 9e 9b f7 db 53 90    call   0x9053:0xdbf79b9e
8048087:       cc                      int3

Hvis intet af dette giver mening, kan du kigge lidt på Linux assembler - En kort introduktion
---
Writing a shellcode decoder stub in assembly is like talking gibberish in such a way that it is still perfectly intelligible. - iTick
Besøg denne brugers hjemmeside Find alle beskeder fra denne bruger
Citer denne besked i et svar
22-05-2016, 00:11
#2
RE: Antidisassembly eksempel fra udfordring
CMP sætter Zflaget til 0 = FALSE. Derfor hhopper JE instruktionen ikke ned til "junk" - Right? Hvorfor skriver du, "0/TRUE" i kommentaren? Er det mig, der er for længe oppe? :p
Find alle beskeder fra denne bruger
Citer denne besked i et svar
22-05-2016, 00:23 (Denne besked var sidst ændret: 22-05-2016, 00:26 af iTick.)
#3
RE: Antidisassembly eksempel fra udfordring
(22-05-2016, 00:11)RalphP Skrev: CMP sætter Zflaget til 0 = FALSE. Derfor hhopper JE instruktionen ikke ned til "junk" - Right? Hvorfor skriver du, "0/TRUE" i kommentaren? Er det mig, der er for længe oppe? :p

Det har du ret i. Jeg tænker mere at udsagnet aldrig bliver sandt, eller resultatet aldrig bliver nul, så zero flaget ikke bliver sat, og der bliver aldrig hoppet til junk. :)
Som du siger, flaget er sat, når det er 1. :)

Jeg har rettet lidt i teksten nu.
---
Writing a shellcode decoder stub in assembly is like talking gibberish in such a way that it is still perfectly intelligible. - iTick
Besøg denne brugers hjemmeside Find alle beskeder fra denne bruger
Citer denne besked i et svar
22-05-2016, 12:03
#4
RE: Antidisassembly eksempel fra udfordring
(22-05-2016, 00:23)iTick Skrev: Det har du ret i. Jeg tænker mere at udsagnet aldrig bliver sandt, eller resultatet aldrig bliver nul, så zero flaget ikke bliver sat, og der bliver aldrig hoppet til junk. :)
Som du siger, flaget er sat, når det er 1. :)

Jeg har rettet lidt i teksten nu.

Aha - okay. Sjov lille anti-diss. finte :p
Find alle beskeder fra denne bruger
Citer denne besked i et svar
22-05-2016, 12:18
#5
RE: Antidisassembly eksempel fra udfordring
(22-05-2016, 12:03)RalphP Skrev: Aha - okay. Sjov lille anti-diss. finte :p

Jep. Og den er super simpel. :)
---
Writing a shellcode decoder stub in assembly is like talking gibberish in such a way that it is still perfectly intelligible. - iTick
Besøg denne brugers hjemmeside Find alle beskeder fra denne bruger
Citer denne besked i et svar
« Ældre | Nyere »




User(s) browsing this thread: 1 Gæst(er)