Tråd bedømmelse:
  • 1 Stemmer - 5 Gennemsnit
  • 1
  • 2
  • 3
  • 4
  • 5
Linux assembler - En kort introduktion
09-10-2013, 19:29
#11
RE: Linux assembler - En kort introduktion
(09-10-2013, 18:40)iTick Skrev: På den måde er windows god. Du kan lave indirekte jumps til din shellcode, ved at jumpe til et sted i user32 eller kernel32, hvor der er et jump til starten af din nopsled i din sandwich. :)

Ok, ved ikke hvad en sandwich er her...et payload gætter jeg på Smile

Hvordan man når sin shellcode er meget afhængig af den konkrete sårbarhed. Typisk peger et register enten direkte ind eller tæt på, og så må man springe lidt rundt til instruktioner som ændrer registeret så det peger et brugbart sted hen. ASLR er altid en sjov udfordring, og DEP gør det endnu sjovere.

Men godt at se, at andre arbejder med assembly...XSS og SQLi er sgu ikke sjovt længere når man har lavet sit første binære exploit!
Find alle beskeder fra denne bruger
Citer denne besked i et svar
11-10-2013, 06:52
#12
RE: Linux assembler - En kort introduktion
(09-10-2013, 19:29)BlimBlamBlar Skrev: Ok, ved ikke hvad en sandwich er her...et payload gætter jeg på Smile

Hvordan man når sin shellcode er meget afhængig af den konkrete sårbarhed. Typisk peger et register enten direkte ind eller tæt på, og så må man springe lidt rundt til instruktioner som ændrer registeret så det peger et brugbart sted hen. ASLR er altid en sjov udfordring, og DEP gør det endnu sjovere.

Men godt at se, at andre arbejder med assembly...XSS og SQLi er sgu ikke sjovt længere når man har lavet sit første binære exploit!

Yup. Din payload. :)
Ja, det er er rigtigt. Det gør ens shellcode mere stabil, hvis man har et register der pejer på ens shellcode. Det hjælper også mod ASLR. :)
DEP kender jeg ikke. Er det til svarende ASLR?

Det er nok også fordi jeg er et gammelt røvhul, jeg synes konsol stuff er sjovere. :)
---
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
11-10-2013, 08:26
#13
RE: Linux assembler - En kort introduktion
(11-10-2013, 06:52)iTick Skrev: Yup. Din payload. :)
Ja, det er er rigtigt. Det gør ens shellcode mere stabil, hvis man har et register der pejer på ens shellcode. Det hjælper også mod ASLR. :)
DEP kender jeg ikke. Er det til svarende ASLR?

Det er nok også fordi jeg er et gammelt røvhul, jeg synes konsol stuff er sjovere. :)

DEP = Data Execution Prevention
Det forhindrer at du kan eksekvere "kode" på stakken eller heapen, og at du kan ændre i kode sektionerne. Men det kan så besejres med ret2libc eller ROP (Return Oriented Programming).
Find alle beskeder fra denne bruger
Citer denne besked i et svar
11-10-2013, 20:45
#14
RE: Linux assembler - En kort introduktion
(11-10-2013, 08:26)BlimBlamBlar Skrev: DEP = Data Execution Prevention
Det forhindrer at du kan eksekvere "kode" på stakken eller heapen, og at du kan ændre i kode sektionerne. Men det kan så besejres med ret2libc eller ROP (Return Oriented Programming).

Ah. Noget ala PaX, kan jeg så gætte. Der bruger man også return2libc. :)
---
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
25-01-2015, 03:01 (Denne besked var sidst ændret: 25-01-2015, 04:50 af iTick.)
#15
RE: Linux assembler - En kort introduktion
Argh, jeg burde opdatere (og rette) denne.
Jeg overvejer at lave noget ren 32bit og noget ren 64 bit.

EDIT: Den er nu opdateret.
Jeg tilføjer så lige nye versioner af cho filtret:
64 bit:
Kode:
;title    "cho"
;********************************************************
;* Filnavn: cho.asm                    *
;* Author: iTick                *
;* Version: 1.0                        *
;* Kernel: 2.6-32-5-amd64                *
;* Dist: Debian (Squeeze)                *
;* Initial Date: 2. Oktober 2013            *
;* Purpose: Filtrere alt andet en alfanummerisk fra    *
;********************************************************
; Dette program compiles og linkes som nedenstående:    *
; nasm -f elf64 ./cho.asm -o ./cho.o -g -Z ./errors.log    *
; ld -o ./cho ./cho.o                    *
; ld -o ./cho ./cho.o -melf_i386 for 32 bit version
; Notes:                        *
; mov rcx, buffer tager adressen, hvor            *
; cmp byte [buffer], 30h tager indholdet        *
;********************************************************
; Syscalls i /usr/include/x86_64-linux-gnu/asm/unistd_64.h
; Arguments i følgende rækkefølge: rax indeholder systemkaldet
; rdi, rsi, rdx, r10, r8, r9

BITS 64        ; Brug 64 bits. Dette er et 64 bit eksempel. IA32 er Intel Architecture 32 bit og kan også bruges.
GLOBAL _start    ; Entry point til ELF linkeren (Det er her, eksekveringen starter)
SECTION .data    ; Start af data area
SECTION    .bss    ; Her lægger vi vores uninitialized data.
    buffer    resb 1

SECTION .text    ; Start af code block. Selve assembler koden skal placeres her under
_start:
    nop
read:
    mov    rax, 0        ; Forbered sys_read() kald. x64
    mov    rdi, 0        ; POSIX filedescriptor stdin
    mov    rsi, buffer    ; Kopier adressen på buffer til ecx
    mov    rdx, 1        ; Læs en enkelt byte fra den valgte filedescriptor stdin
    syscall            ; Overgiv kontrollen til kernen og lad den udføre sys_read()

    cmp    rax, 0        ; Læs returkoden fra sys_read() kaldet. Sammenlign returkoden med 0
    je    exit        ; Hvis de er ens, hoppes der til exit. 0 betyder EOF

    ; Kontroller om det er mellemrum. 20h
    cmp    byte [buffer], 20h    ; Kontroller om bufferen indeholder hex værdien for ascii tegnet mellemrum
    je    write                ; Hvis det er ascii 20h, er det mellemrum. Så hop til write. je er Jump Equal

    ; Komtroller ascii værdierne 0-9
    cmp    byte [buffer],30h    ; Sammenlign den læste værdi med 30h (ascii tallet 0, som i 2, 1, 0)
    jb    read                ; Hvis den er mindre end 0 er det et speciel tegn. Så springer vi til read og læser et nyt tegn
    cmp    byte [buffer],3Ah    ; Hvis vi er kommet her til og vi er laver end hex 3A, er det et tal. Det skriver vi ud
    jb    write                ; Brug jb Jump Below til at hoppe til write.

    ; kontroller ascii værdierne A-Z
    cmp    byte [buffer], 41h    ; Sammenlign den læste værdi med 41h (A), hvis den er mindre, er det ikke et bogstav
    jb    read                ; Hvis ascii tegnet var mindre, så hop til read
    cmp    byte [buffer], 5Bh    ; Hvis den er mindre end 5B har vi ramt i ascii range med store bogstaver. Det vil vi udskrive
    jb    write

    ; Kontroller ascii værdierne a-z
    cmp    byte [buffer], 61h    ; Hvis værdien er mindre end 61 så er det ikke et lille bogstav. Så læser vi et nyt
    jb    read                ; Jumo tilread og læs et nyt tegn hvis ascii værdien er "below" 61h
    cmp    byte [buffer], 7Bh    ; Sammenlign. Hvis tegnet er mindre end 7Bh, vil vi skrive det ud
    jb    write                ; Hop til write, hvis bufferen indeholder et tegn som er mindre end 7Bh

    jmp    read        ; Hop til read og start forfra, lige meget hvad

write:
    mov    rax, 1        ; Forbered sys_write()
    mov    rdi, 1        ; Vi vil gerne skrive til filedescriptor 1, stdout
    mov    rsi, buffer    ; ecx skal kende adressen som bufferen har. Her er det tegn vi gerne vil skrive ud
    mov    rdx, 1        ; Dette er antal bytes vi gerne vil skrive med sys_write()
    syscall            ; Kald kernens 80h vector og lad den udføre sys_write()
    jmp    read        ; Hop til read lige meget hvad. Vi vil læse det næste tegn, eller kontrollere om der er mere input

exit:
    mov    rax,60        ; Systemkaldet til exit()
    mov    rdi,0        ; Returkoden til operativsystemet
    syscall            ; Udfør systemkaldet exit(). Eksekveringen må ikke fortsætte længere end her til

32 bit udgave
Kode:
;title    "cho"
;********************************************************
;* Filnavn: cho.asm                    *
;* Author: iTick                *
;* Version: 1.0                        *
;* Kernel: 2.6-32-5-amd64                *
;* Dist: Debian (Squeeze)                *
;* Initial Date: 2. Oktober 2013            *
;* Purpose: Filtrere alt andet en alfanummerisk fra    *
;********************************************************
; Dette program compiles og linkes som nedenstående:    *
; nasm -f elf32 ./cho.asm -o ./cho.o -g -Z ./errors.log    *
; ld -o ./cho ./cho.o for 64bit version                    *
; ld -o ./cho ./cho.o -melf_i386 for 32 bit version
; Notes:                        *
; mov ecx, buffer tager adressen, hvor            *
; cmp byte [buffer], 30h tager indholdet        *
;********************************************************

BITS 32        ; Brug 32 bits. Dette er et 32 bit eksempel. IA32 er Intel Architecture 32 bit .
GLOBAL _start    ; Entry point til ELF linkeren (Det er her, eksekveringen starter)
SECTION .data    ; Start af data area
SECTION    .bss    ; Her lægger vi vores uninitialized data.
    buffer    resb 1

SECTION .text    ; Start af code block. Selve assembler koden skal placeres her under
_start:
    nop
read:
    mov    eax, 3        ; Forbered sys_read() kald
    mov    ebx, 0        ; POSIX filedescriptor stdin
    mov    ecx, buffer    ; Kopier adressen på buffer til ecx
    mov    edx, 1        ; Læs en enkelt byte fra den valgte filedescriptor stdin
    int    80h        ; Overgiv kontrollen til kernen og lad den udføre sys_read()

    cmp    eax, 0        ; Læs returkoden fra sys_read() kaldet. Sammenlign returkoden med 0
    je    exit        ; Hvis de er ens, hoppes der til exit. 0 betyder EOF

    ; Kontroller om det er mellemrum. 20h
    cmp    byte [buffer], 20h    ; Kontroller om bufferen indeholder hex værdien for ascii tegnet mellemrum
    je    write            ; Hvis det er ascii 20h, er det mellemrum. Så hop til write. je er Jump Equal

    ; Komtroller ascii værdierne 0-9
    cmp    byte [buffer],30h    ; Sammenlign den læste værdi med 30h (ascii tallet 0, som i 2, 1, 0)
    jb    read            ; Hvis den er mindre end 0 er det et speciel tegn. Så springer vi til read og læser et nyt tegn
    cmp    byte [buffer],3Ah    ; Hvis vi er kommet her til og vi er laver end hex 3A, er det et tal. Det skriver vi ud
    jb    write            ; Brug jb Jump Below til at hoppe til write.

    ; kontroller ascii værdierne A-Z
    cmp    byte [buffer], 41h    ; Sammenlign den læste værdi med 41h (A), hvis den er mindre, er det ikke et bogstav
    jb    read            ; Hvis ascii tegnet var mindre, så hop til read
    cmp    byte [buffer], 5Bh    ; Hvis den er mindre end 5B har vi ramt i ascii range med store bogstaver. Det vil vi udskrive
    jb    write

    ; Kontroller ascii værdierne a-z
    cmp    byte [buffer], 61h    ; Hvis værdien er mindre end 61 så er det ikke et lille bogstav. Så læser vi et nyt
    jb    read            ; Jumo tilread og læs et nyt tegn hvis ascii værdien er "below" 61h
    cmp    byte [buffer], 7Bh    ; Sammenlign. Hvis tegnet er mindre end 7Bh, vil vi skrive det ud
    jb    write            ; Hop til write, hvis bufferen indeholder et tegn som er mindre end 7Bh

    jmp    read        ; Hop til read og start forfra, lige meget hvad

write:
    mov    eax, 4        ; Forbered sys_write()
    mov    ebx, 1        ; Vi vil gerne skrive til filedescriptor 1, stdout
    mov    ecx, buffer    ; ecx skal kende adressen som bufferen har. Her er det tegn vi gerne vil skrive ud
    mov    edx, 1        ; Dette er antal bytes vi gerne vil skrive med sys_write()
    int    80h        ; Kald kernens 80h vector og lad den udføre sys_write()
    jmp    read        ; Hop til read lige meget hvad. Vi vil læse det næste tegn, eller kontrollere om der er mere input

exit:
    mov    eax,1        ; Systemkaldet til exit()
    mov    ebx,0        ; Returkoden til operativsystemet
    int    0x80        ; Udfør systemkaldet exit(). Eksekveringen må ikke fortsætte længere end her til
---
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
18-06-2015, 02:52
#16
RE: Linux assembler - En kort introduktion
Jeg synes det er lidt overkill at lave en ny tråd for dette, men der er nogle fede online assemblers/disassemblers:
https://www.onlinedisassembler.com/odaweb/
https://gcc.godbolt.org/
http://assembly.ynh.io/

Og til andre sprog:
http://webcompiler.cloudapp.net/
http://codepad.org/
https://ganquan.info/g++-compiler/

Jeg har ikke prøvet dem alle før, men de er sq meget handy. Og godt legetøj.
---
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)