09-10-2013, 19:29
|
|
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å
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!
|
|
11-10-2013, 06:52
|
|
iTick
x64 has PIC
|
Indlæg: 648
Registreret: Jul 2013
Omdømme:
47
|
|
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å
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
|
|
11-10-2013, 08:26
(Denne besked var sidst ændret: 03-11-2024, 15:15 af BlimBlamBlar.)
|
|
RE: Linux assembler - En kort introduktion
slettet slettet slettet slettet
|
|
11-10-2013, 20:45
|
|
iTick
x64 has PIC
|
Indlæg: 648
Registreret: Jul 2013
Omdømme:
47
|
|
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
|
|
25-01-2015, 03:01
(Denne besked var sidst ændret: 25-01-2015, 04:50 af iTick.)
|
|
iTick
x64 has PIC
|
Indlæg: 648
Registreret: Jul 2013
Omdømme:
47
|
|
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
|
|
18-06-2015, 02:52
|
|
iTick
x64 has PIC
|
Indlæg: 648
Registreret: Jul 2013
Omdømme:
47
|
|
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
|
|
|