Speicherposition Verständnisfrage C

mogbo

Banned
Hallo,
kurze Frage zur RAM-Verwaltung

Hostsystem ist ein OpenBSD-current auf amd64, darauf liegt eine VM mit OpenBSD 6.1 amd64 (Patchstand aktuell)

nun zum ausgeführten Code kompiliert mit einem simplen make (in der VM):
Code:
#include <stdio.h>

int main()
{
    int a = 5;
    int *b;
    b = &a;

    printf("Wert von a %d\n", a);
    printf("Wert von a %d\n", *b);

    printf("Position a %d\n", b);
    printf("Position a %d\n", &a);
    printf("Position b %d\n", &b);

    return 0;
}
Kein Copy+Paste, hoffe ich habe keinen Schreibfehler.

Ausgabe:
Code:
Wert von a 5
Wert von a 5
Position a -194684
Position a -194684
Position b -194696

Ich dachte ASLR würde hier die Positionen weiter von einander entfernen oder habe ich einen Denkfehler?

Sorry für die evtl. leicht zu googelnde Frage, finde jedoch leider nichts :P
 
ASLR veraendert function entry points oder zB mmap. Verschiebe mal 'b' in eine eigene function und ruf das aus main() auf.
Vielen dank

test3.c
Code:
#include <stdio.h>

int b()
{
    return b;
}

int main()
{
    int a = 5;

    printf("Position von b %d\n", &b);
    printf("Position von a %d\n", &a);

    return 0;
}
kein copy+paste

Ausgabe:
Code:
Position von b -1805646464
Position von a -29716

Vielen Dank, habe wieder was gelernt
 
Zuletzt bearbeitet:
Was ich spannend fand ist das man auch zwingend PIE/PIC (ist bei OpenBSD wohl der Default?!) Binaries und Libs braucht, damit ASLR ueberhaupt richtig funktioniert…

Siehe auch:

https://wiki.gentoo.org/wiki/Hardened/PaX_Quickstart#Address_Space_Layout_Randomization_.28ASLR.29
http://security.cs.rpi.edu/courses/binexp-spring2015/lectures/15/09_lecture.pdf

Unter Solaris 11.3 sieht das z.B. so aus:

$ cc -m64 -g aslr-test.c
$ ./a.out
main @ 400e20
doit @ 400e00
$ ./a.out
main @ 400e20
doit @ 400e00

$ cc -m64 -g aslr-test.c -zaslr=enable
$ ./a.out
main @ 400e20
doit @ 400e00
$ ./a.out
main @ 400e20
doit @ 400e00

$ cc -m64 -g -KPIC aslr-test.c -ztype=pie
$ ./a.out
main @ ffff80ffbf5fdee0
doit @ ffff80ffbf5fdec0
$ ./a.out
main @ ffff80ffbf5fdee0
doit @ ffff80ffbf5fdec0

$ cc -m64 -g -KPIC aslr-test.c -ztype=pie -zaslr=enable
$ ./a.out
main @ 7ff8d4ce8ee0
doit @ 7ff8d4ce8ec0
$ ./a.out
main @ 7ff669837ee0
doit @ 7ff669837ec0
 
Man kann zumindest GCC mit dem Flag "--enable-default-pie" kompilieren. Das macht z.B. ArchLinux. Ich vermute OpenBSD tut das auch.
 
Man kann zumindest GCC mit dem Flag "--enable-default-pie" kompilieren. Das macht z.B. ArchLinux. Ich vermute OpenBSD tut das auch.
http://llvm.org/viewvc/llvm-project?view=revision&revision=183295
Hab, wenn ichs richtig verstehe, eben den Beweis gefunden.

OpenBSD verwendet glaube ich ab 6.2 kein gcc mehr im Base, aber auch hier habe ich eine Diff gefunden
http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20130603/080888.html

Hoffe ich habe beide Links richtig verstanden, lieber nochmal die Quellen ansehen, wenns wer sicher wissen möchte
 
Ja. Sieht ganz nach Standard-Flag aus. Ich mein, wenn man es ohne Flags kompiliert und es trotzdem umhergeschoben werden kann, spricht ja auch so alles danach. Ansonsten wären die Adressen immer gleich.
 
spricht ja auch so alles danach. Ansonsten wären die Adressen immer gleich.
Achtung Halbwissen :) :

https://hal-univ-tlse3.archives-ouvertes.fr/hal-01135160/file/openbsd.pdf
Auf Seite 17 ist ein Modell ohne und eins mit PIE zu sehen, gibt wohl Architekturen in denen ASLR nur bedingt möglich ist, somit könnte ich evtl gerade eine unvollständigere Form nutzen. Wenn ich die ganze Thematik aber generell richtig verstanden habe verwendet OpenBSD wohl im Default alles so wie es die Architektur hergibt.
 
Zurück
Oben