Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

shellcode

[es] :: Asembler :: shellcode
(TOP topic)

[ Pregleda: 11386 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

punkey
Daniel Trifunovic
Student
Beograd

Član broj: 1028
Poruke: 43
195.252.68.*

ICQ: 309629465


Profil

icon shellcode03.03.2002. u 19:25 - pre 269 meseci
recimo da imamo sledeci asm kod koji je ustvari shellcode:
void main(){
__asm__("jmp 0x1e \n" //jmp to call
"popl %esi \n" //get seved EIP to esi,now we have /bin/sh address
"movl %esi,0x8(%esi) \n" //address of sh behind /bin/sh
"movl $0x0,0xc(%esi) \n" //NULL as 3rd argument goes after sh address
"movb $0x0,0x7(%esi) \n" //terminate /bin/sh with '\0'
"movl %esi,%ebx \n" //address of sh[0] in %ebx
"leal %0x8(%esi),%ecx \n" //address of sh in %ecx(2nd argument)
"leal %0xc(%esi),%edx \n" //address of NULL in %edx(3rd argument)
"movl $0xb,%eax \n" //sys call of execve in %eax
" int $0x80 \n" //kernel mode
" call -0x23 \n" //call popl %esi
" .string \"/bin/sh\" \n"); //our string
}

e interesuje me kako izracunati brojku koja stoji pored jmp instrukcije koja skace na call, tj. kako se izracunava ta udaljenost na koju treba skociti? tnx unapred!
 
Odgovor na temu

random
Vladimir Vrzić
Beograd

Član broj: 85
Poruke: 3866
194.106.163.*

Sajt: www.last.fm/user/vrza


+4 Profil

icon Re: shellcode03.03.2002. u 23:27 - pre 269 meseci
Vrlo jednostavno, to je broj bajtova koji treba da se preskoči do instrukcije call. Iskompajiraj to, otvori ga u debageru (gdb imefajla.c), i uradi "disass main", dobićeš nešto u stilu

Code:

Dump of assembler code for function main:
0x804839c <main>:       push   %ebp
0x804839d <main+1>:     mov    %esp,%ebp
0x804839f <main+3>:     jmp    0x1e
0x80483a4 <main+8>:     pop    %esi
0x80483a5 <main+9>:     mov    %esi,0x8(%esi)
0x80483a8 <main+12>:    movl   $0x0,0xc(%esi)
0x80483af <main+19>:    movb   $0x0,0x7(%esi)
0x80483b3 <main+23>:    mov    %esi,%ebx
0x80483b5 <main+25>:    lea    0x8(%esi),%ecx
0x80483b8 <main+28>:    lea    0xc(%esi),%edx
0x80483bb <main+31>:    mov    $0xb,%eax
0x80483c0 <main+36>:    int    $0x80
0x80483c2 <main+38>:    call   0xffffffdd
(i tako dalje)...


Sad primeti da je u trenutku izvršavanja jmp instrukcije EIP 0x80483a4, a call instrukcija se nalazi na adresi 0x80483c2 (kod tebe će adrese možda biti drugačije!). Razlika ove dve adrese je upravo offset za koji treba da se skoči -- 0x80483c2 - 0x80483a4 = 0x1e!
int rand(void);

Those who do not understand Unix are condemned to reinvent it, poorly.

Upali lampicu — koristi Jabber!
 
Odgovor na temu

punkey
Daniel Trifunovic
Student
Beograd

Član broj: 1028
Poruke: 43
*.rstel.net

ICQ: 309629465


Profil

icon Re: shellcode06.03.2002. u 17:08 - pre 269 meseci
ajde da ne otvaram novi topic, ovde cu da postavim jos par pitanja u vezi ove teme. recimo imamo sledeci kod:

jmp offset-to-call # 2 bytes
popl %esi # 1 byte
movl %esi,array-offset(%esi) # 3 bytes
movb $0x0,nullbyteoffset(%esi)# 4 bytes
movl $0x0,null-offset(%esi) # 7 bytes
movl $0xb,%eax # 5 bytes
movl %esi,%ebx # 2 bytes
leal array-offset,(%esi),%ecx # 3 bytes
leal null-offset(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
movl $0x1, %eax # 5 bytes
movl $0x0, %ebx # 5 bytes
int $0x80 # 2 bytes
call offset-to-popl # 5 bytes
/bin/sh string goes here.

e interesuju me sledece stvari sta je ustvari array-offset, pa null offset etc. ma najbolje bi bilo ako bi neko mogao ljudski objasniti sve ovo, bas kao sto je random objasnio odgovor na moje prethodno pitanje. hvala unapred!
 
Odgovor na temu

SnOoP
ARDIS - Optimisation software

Član broj: 522
Poruke: 31
*.its.rmit.edu.au

ICQ: 17672962
Sajt: www.pozarnica.net


Profil

icon Re: shellcode19.03.2002. u 03:38 - pre 268 meseci
kao prvo pametno bi bilo da kopiras cjeli code jer tako i moze da se izracuna offset za kojekakvu operaciju jmp call funkcija etc...

1. prvo moras da se pitas sta je offset.. potom bi bilo dobro da znas i sta je segment (segment:offset)

sta je segment.. memorija je segmentovana u kolekciju bajtova... i ona se moze accessovati samo ako spesifikujes OFFSET broj koji se nalazi u XXXX segmentu...
npr: 4:3 Segment =4 .. offset 3... i da bi dobijo physical addres segment:offset`a uradis ovu kalkulaciju:

4(segment) x 10(hex) = 40 + 3 (offset) .. physical address = 0x43

Code:

         +--+--+--+--+--+
       5 |  |  |  |  |  |
         +--+--+--+--+--+
       4 |  |  |* |  |  |
Y axis   +--+--+--+--+--+
       3 |  |  |  |  |  |
         +--+--+--+--+--+
       2 |  |  |  |  |  |
         +--+--+--+--+--+
       1 |  |  |  |  |  |
         +--+--+--+--+--+
           1  2  3  4  5  
             X axis     

ili jos lakse ako se gleda bas tako... npr.

evo jedan lagan programcic

db "Sta ima care$" ; string koji zelimo da isprintamo
movl %eah,9 ; adresa funkcije koju cemo da stavimo u ah akumulator (koji je inace koriscen za I/O funkcije, operatore
movl %edx,OFFSET : broj offsetá koji ce da ide u dx akumulator (koji se inace koristi za drugaciju datu.. ili character display)
int 21 ; call za funkciju slucnu printf(); u c`u(STDOUT)
int 20 ; terminate (exit)

e sada gde je movl %edx,OFFSET <--- ovaj tu broj ce da bude adresa gde se onaj string "Sta ima care" nalazi.
npr

100:100 db "Sta ima care$"
znaci
sledeca sledeca linija ce da bude
mov %edx,100 (offset)

offset je broj koji udaljava dva pointa u memori...
1 *bla
2
3
4
5 *blahhhh

*blahhhh je udaljen 4 mjesta od *bla
vrlo sam pospan i mrvicu pjan dok pisem ovo al nadam se da ti je pomoglo...
bar malo
hehe


[Ovu poruku je menjao random dana 01.12.2004. u 04:59 GMT+1]
int mailme()
{
char email[21]="\x115\x110\x111\x111\x112\x64\x110\x111\x115\x116\x97\x108\x103\x105\x106\x97\x46\x99\x111";
return 0;
}

The important thing is not to stop questioning. Curiosity has its own reason for existing. (Albert Einstein) ;-)
 
Odgovor na temu

SnOoP
ARDIS - Optimisation software

Član broj: 522
Poruke: 31
*.its.rmit.edu.au

ICQ: 17672962
Sajt: www.pozarnica.net


Profil

icon Re: shellcode19.03.2002. u 03:39 - pre 268 meseci
uh izvinjavam se za onaj table ... nije bas ispo sto sam ja mislijo da ce da ispadne al uglavnom gledaj ga kao x axis i y axis
:)
int mailme()
{
char email[21]="\x115\x110\x111\x111\x112\x64\x110\x111\x115\x116\x97\x108\x103\x105\x106\x97\x46\x99\x111";
return 0;
}

The important thing is not to stop questioning. Curiosity has its own reason for existing. (Albert Einstein) ;-)
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
195.252.86.*



+1 Profil

icon Re: shellcode06.11.2004. u 22:52 - pre 236 meseci
Si probao sa labelima?
ono tipa

Code:

jmp ovde
..........
ovde:
call .....


mislim da compiler bese to automatski pretvara u brojku...
Tako da otvori u dbg pogledaj koju je brojku stavio kod jmp i eto =)

ps. da se ogradim davno se nisam baktao ovim ali mislim da sam
ja tako resavao taj problem =)

p.s. sad sam proverio i da =) tako sam ja resavao taj problem

evo vako:
Code:

jmp lcall:
leip:
pop ebp

lcall:
call leip


Mada imas jos bolju tehniku a to ti je da napravis /bin/sh string putem push instrukcija i dobijes znatno manji shellcode =)
nesto ovako bi trebalo da izgleda, a ti poslepreradi u hex
Code:

xor eax, eax
push eax  <--- null terminated string
push //sh
push /bin
mov ebx, esp        <--- u ESP imas adresu od /bin/sh eto to je to =)
 
Odgovor na temu

[es] :: Asembler :: shellcode
(TOP topic)

[ Pregleda: 11386 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.