Toon posts:

[asm] directory max 4 chars??

Pagina: 1
Acties:

Verwijderd

Topicstarter
via:

mkdir.c
-
mkdir("testen" , 0755);
--

als je dit disassembled via gdb moet je dus via hex de code pushen als ik het goed heb

pushl $0x<hex code dir> alleen dit mogen dus volgens mij maar 4 chars max zijn. Als je die compiled krijg je dus test te zien ipv testen, klopt dat? ... zo ja hoe maak je dat langer? Ben net begonnen met asm dus neem me niet kwalijk dat het noobie overkomt.

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:53

Reptile209

- gers -

Nee, dat klopt niet. De compiler reserveert ergens geheugen voor de string "testen"+\0. Het adres van die string past wel in een double-word (?). Najah, 4 bytes dus.

Zo scherp als een voetbal!


Verwijderd

Topicstarter
dus hoe zou je dat nou aan moeten geven in de mkdir.s?

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:53

Reptile209

- gers -

afaik is mkdir geen assembly, dus dat staat vast wel bij de F van F1 :)
Je hebt een string met je dir, maak een pointer naar die string en gebruik die in je functie. Kijk anders eens op programmeer.pagina.nl naar een leuke asm-tutorial om mee te beginnen, want dit gaat een lang verhaal worden ben ik bang.

Nog een losse tip: als je nou eens 3 mkdirs achter elkaar zet met 3 verschillende namen, dan zie je precies wat de compiler doet. Hou dan in je achterhoofd dat je op het adres (4 bytes) moet gaan zoeken naar de gebruikte string.

Zo scherp als een voetbal!


Verwijderd

Je vraagstelling is niet echt duidelijk, maar je hebt als ik het goed begrijp dus een probleem, waarbij je een directory wil aanmaken, maar wat je hebt geprogrammeerd in C werkt niet, en nu ging je het debuggen, en zag je dat er een pushl werd gedaan en dat snap je niet, klopt dat?

Hoe ziet je C-code eruit, en dan met name het prototype van je functie? Ik neem aan dat je hier een prototype hebt, zoiets als:
C:
1
int mkdir(char* dirname, int mode);

In dit prototype is te zien, dat het eerste argument van de functie een char pointer moet zijn. Zo'n pointer heeft de breedte van size_t wat in het geval van een x86 machine inhoud dat het een doubleword is, oftewel een 32bits breed adres van een null-terminated string. Je push-t dus niet de string zelf, maar het startadres van de string.

In gnu assembly doe je zonder dan ongeveer zoiets als:
GAS:
1
2
3
4
5
6
7
8
dirname:
    .string "testen"

[knip]

    pushl $493
    pushl dirname
    call mkdir


Uitgaande van de standaard "C" calling conventie...

edit:
Afhankelijk van wat hierna volgt, hoor je hierna inderdaad de stack weer 8 bytes terug zetten... Tnx .oisyn |:( Pas maar op of ik ga je in geuren en kleuren over mijn ingegroeide teennagels vertellen, dat je d'r helemaal bleek van wegtrekt... >:)

[ Voor 20% gewijzigd door Verwijderd op 12-03-2004 15:44 . Reden: reden van edit: .oisyn :( wie anders ;) ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet nog even de stackpointer terugzetten ;)

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
sorry, ik zal het eens wat duidelijker uitleggen.

het begint zo:

mkdir.c
---------------------------------------------------------------------------------
#include <stdio.h>

int main()
{
mkdir("1337", 0755);' /* die 1337 komt uit het voorbeeld */
return 0;
}

---------------------------------------------------------------------------------

compilen

gdb mkdir
disassemble main

vervang je wat spul en dan krijg je een hex code voor die dir die max 4 bytes is ( nu is mijn vraag hoe ik deze langer maak).


mkdir.s
------------------------------------------------------------------------
.section .text
.global main

main:
pushl $0x0
pushl $0x37333331
movl $0x1ed, %ecx
movl %esp, %ebx

movl $0x27, %eax
int $0x80
xorl %ebx, %ebx
movl $0x1, %eax
int $0x80
------------------------------------------------------------------------

nu wil ik dus die dir 1337 bijvoorbeeld door hoertje ofzo vervangen die zet je dan in hex maar als je die wil compilen via gcc -o mkdir mkdir.s krijg je dus alleen een dir genaamd hoer waarbij -tje weg wordt gelatem. nu wil ik dus weten hoe je dan een langere dir kan maken.

  • MikeN
  • Registratie: April 2001
  • Laatst online: 25-05 19:19
Misschien klinkt dit heel stom ofzo hoor, maar kun je niet in je C code die 1337 veranderen in abcdefghijklmnop ofzo, dan compilen en disassemblen en dan kijken wat de code dan is? :)

[edit]
Overigens, met mijn zeer beperkte ASM kennis, lijkt het me dat

pushl $0x0
pushl $0x37333331

1337\0 ergens neerzet in omgekeerde volgorde.

Als je hiervan

pushl $0x0
pushl $0x37333331
pushl $0x37333331

maakt, krijg je dan geen dir met als naar 13371337 ?

[ Voor 44% gewijzigd door MikeN op 12-03-2004 14:24 ]


Verwijderd

Topicstarter
MikeN schreef op 12 maart 2004 @ 14:21:
Misschien klinkt dit heel stom ofzo hoor, maar kun je niet in je C code die 1337 veranderen in abcdefghijklmnop ofzo, dan compilen en disassemblen en dan kijken wat de code dan is? :)
haha nee met het dissasemblen krijg je namelijk die hex code niet die heb ik ergens anders via je op gevraagd, maar in die asm code schrijft ie toch maximaal maar 4 bytes van de dir die je opgeeft dus het maakt niet uit hoet groot je dir is, hij pakt altijd de1ste 4 bytes

[edit]
Overigens, met mijn zeer beperkte ASM kennis, lijkt het me dat

pushl $0x0
pushl $0x37333331

1337\0 ergens neerzet in omgekeerde volgorde.

Als je hiervan

pushl $0x0
pushl $0x37333331
pushl $0x37333331

maakt, krijg je dan geen dir met als naar 13371337 ?

ja maar als je dan bijv 13371 wilt hebben hoe doe je het dan?

[ Voor 24% gewijzigd door Verwijderd op 12-03-2004 14:27 ]


Verwijderd

offtopic:
Voor code-listing is het wel zo prettig om deze tussen [plain][code] [/code][/] tags te zetten, en dan het liefst nog met [code=C] of [code=asm] o.i.d.


Wat hier gebeurt is dat de string op de stack wordt gepushed. Daartoe kun je inderdaad de string -in omgekeerde volgorde en gepacked per 4 karakters als long- zelf pushen op de stack. Daarna push je het adres van deze string op diezelfde stack en call je de functie. Na het callen van deze functie zorg je dat je de stack terug zet, daarbij ook rekening houdend met de string die je gepushed hebt!

Bij jouw disassembly is de mkdir functie echter geinlined, waardoor het startadres niet gepushed wordt van je string, maar naar ebx wordt gecopiēerd... Als je je code wilt gaan debuggen is het verstanding om altijd met "-O0 -g" te compileren, zodat je dit soort inline-en ook meteen voorkomt... Je kunt ook specifiek het inlinen van functies uitzetten, voor gcc is dat -fno-inline bijvoorbeeld. Het zal het voor je een stuk overzichtelijker maken...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

.edit: ik lees niet goed |:(

Maar waarom zou je het allemaal op de stack willen pushen? Je kunt je string ook gewoon ergens als definieren, en dan ebx laten wijzen naar het adres van deze data.

[ Voor 173% gewijzigd door .oisyn op 12-03-2004 15:37 ]

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.


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 21-05 09:01

klinz

weet van NIETS

Verwijderd schreef op 12 maart 2004 @ 14:25:
[...]
maar in die asm code schrijft ie toch maximaal maar 4 bytes van de dir die je opgeeft dus het maakt niet uit hoet groot je dir is, hij pakt altijd de1ste 4 bytes
Die 4 bytes representeren geen karakters, maar een adres. Op dat adres staat de string. Die string kan dan willekeurig groot zijn (nou ja, binnen zeker limieten natuurlijk).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

klinz schreef op 13 maart 2004 @ 11:38:
[...]

Die 4 bytes representeren geen karakters, maar een adres. Op dat adres staat de string. Die string kan dan willekeurig groot zijn (nou ja, binnen zeker limieten natuurlijk).
Kijk eens goed naar de code, hij pusht de string namelijk op de stack, en stopt daarna het adres ervan (de inhoud van het esp register dus) in ebp

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