Toon posts:

[nasm] code runnen uit .bss segment, retf seg-fault

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb een stukje code geschreven, het is uiteindelijk een deel van de code die het runt kan aanpassen, omdat ik niets kan editten aan het text segment dacht ik, dan doe je dat in bss. Maar het programma seg-fault wanneer ik wil returnen naar buf :s.

GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
section .bss
buf     resb    100
bufsize equ     $ - buf

section .data
file    db      "code.o"

section .text

        global _start

_start:
        mov     ebx,[file]
        mov     eax,5
        mov     ecx,0
        int     0x80

        mov     ebx,eax
        push    eax
        mov     eax,3
        mov     edx,bufsize
        mov     ecx,buf
        int     0x80

        push    cs
        push    buf
        retf

        mov     ebx,0
        mov     eax,1
        int     0x80


in code.o staat een stukje (werkende) shellcode, dat heb ik getest.
het programma crashed na retf. :(

Weet iemand wat ik verkeerd doe?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik denk...dat er op je bss segment geen execute flag wordt gezet. Dan kan je dus geen code uitvoeren in dat segment. Wat gebeurt er trouwens met die push eax, voor die twee andere pushes? Wordt die later wel weer gepopped?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Onder welk OS draai je dit? En welke linker gebruik je?

.edit: en waarom doe je het trouwens met een retf, en niet gewoon met een jmp buf :?

[ Voor 81% gewijzigd door .oisyn op 26-05-2004 16:26 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
ik draai linux, en ik gebruik geen jmp omdat hij dan niet assembled (instruction expected).

(int 0x80 is de linux-kernel interrupt)

push eax is idd nutteloos, die 2 andere echter niet.

cs en buffer worden gepopt door retf.

me linker:
GNU ld version 2.14.90.0.7 20031029

[ Voor 12% gewijzigd door Verwijderd op 27-05-2004 17:08 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 27 mei 2004 @ 16:49:
ik draai linux, en ik gebruik geen jmp omdat hij dan niet assembled (instruction expected).
GAS:
1
jmp buf
zou gewoon moeten werken hoor

Maar goed, als je het dan toch per se met een return wilt doen, waarom dan een retf en niet gewoon een ret? :) Maar goed, dat is het probleem niet. Ik denk dat buf toch niet goed geinitialiseerd is. Je zegt dat ie crashed, wat voor error krijg je dan?

[ Voor 6% gewijzigd door .oisyn op 28-05-2004 15:22 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
GDB - output:

run:
    Starting program: /home/psychic/codor/asm/eip-manipulation/eipman 

    Program received signal SIGSEGV, Segmentation fault.
    0x080490bc in ?? ()

Info Register (stripped):
    
    ecx            0x80490bc        134516924
    eip            0x80490bc        0x80490bc
    cs             0x23     35
0x80490bc is buffer.

/me kijkt naar het verschil tussen dat en 0xc0000000 :X
eh, zit dat niet veel te hoog om uit te kunnen voeren?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Wat gebeurt er als je er gewoon section .text van maakt ipv bss? Lijkt er echt op dat er geen execute flag is gezet op de segment descriptor van bss. Hij geeft namelijk een segfault bij de eerste instructie van de buffer.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nou ja hij gebruikt sowieso niet de segment descriptor van bss, omdat ie cs gebruikt, maar meestal wordt daar sowieso geen aparte segment descriptor voor gebruikt. Het enige wat ik me er bij voor kan stellen is dat cs niet lang genoeg wordt gemaakt omdat er geen execute rechten op zitten, waardoor ds dus een groter geheugengebied overspant dan cs.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1