Verständnis für ein Use-after-free Bug

Hallo Leute,

ich versuche gerade hier ein "Use-after-free"-Programm für Linux zu kapieren. D.h. ich will eigentlich nur verstehen, was genau unter der Haube passiert. Der Code zu dem Programm ist zu finden unter: oss-sec: Linux tcp_xmit_retransmit_queue use after free on 4.8-rc1 / master

Ich brauche schon recht weit vorne Hilfe. Da steht die folgende Zeile:

Code:
r[0] = syscall(SYS_mmap, 0x20000000ul, 0x20000ul, 0x3ul, 0x32ul, 0xfffffffffffffffful, 0x0ul);

Der Kerl, der dieses kleine Programm geschrieben hat, verwendet für folgende Parameter die entsprechenden Werte:

addr - 0x20000000ul
length - 0x20000ul
prot - 0x3ul
flags - 0x32ul
fd - 0xfffffffffffffffful
offset - 0x0ul

Hab ich jetzt von mmap(2) - Linux manual page genommen. Was ich hier jedoch nicht nicht verstehe, ist, wie er auf den Wert 0x32ul bei "flags" kommt. Wenn ich nach Flag-Werten für die Funktion mmap suche, finde ich nichts konkretes.

Deswegen kam ich dann auf die Idee mal zu schauen, was ich so auf meinem System finde.

Unter meinem Kali Linux System habe ich ene Datei
-> /usr/include/i386-linux-gnu/sys/mman.h die die Datei
-> /usr/include/i386-linux-gnu/bits/mman.h inkludiert, die wiederum die Datei
-> /usr/include/i386-linux-gnu/bits/mman-linux.h inkludiert,
und in dieser Datei finde ich nur folgenden Part:

Code:
/* Sharing types (must choose one and only one of these).  */
#define MAP_SHARED      0x01            /* Share changes.  */
#define MAP_PRIVATE     0x02            /* Changes are private.  */
#ifdef __USE_MISC
# define MAP_TYPE       0x0f            /* Mask for type of mapping.  */
#endif

/* Other flags.  */
#define MAP_FIXED       0x10            /* Interpret addr exactly.  */
#ifdef __USE_MISC
# define MAP_FILE       0
# ifdef __MAP_ANONYMOUS
#  define MAP_ANONYMOUS __MAP_ANONYMOUS /* Don't use a file.  */
# else
#  define MAP_ANONYMOUS 0x20            /* Don't use a file.  */
# endif
# define MAP_ANON       MAP_ANONYMOUS
/* When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size.  */
# define MAP_HUGE_SHIFT 26
# define MAP_HUGE_MASK  0x3f
#endif

Also 0x32ul ist ja der Wert 66 im Dezimalsystem. Nur wie kommt der Kerl jetzt auf den Wert 0x32ul.

Mir kam zuerst der Gedanke, ich mache folgendes

Code:
MAP_TYPE | MAP_FIXED | MAP_ANONYMOUS

Aber soweit ich das verstehe, komme ich hier erstmal nur auf 63.

Hat jemand von euch eine Idee oder kann mir hier jemand helfen? Ich stehe irgendwie auf dem Schlauch ... ;(;(;(

EDIT

Ich habe heute morgen nochmal auf meinen Zettel mit ein paar Notizen angeschaut und gemerkt, dass 0x32ul gar nicht 66 sein kann.

0x32ul ist in Dezimal 50. Und die Kombination dieser Flags würde passen ...

Code:
MAP_ANONYMOUS | MAP_FIXED | MAP_PRIVATE
 
Zuletzt bearbeitet:
Code:
MAP_ANONYMOUS | MAP_FIXED | MAP_PRIVATE

Das stimmt ;)
Was ist jetzt deine Frage?

Ein Tipp zu solchen Flag values die bitweise mit OR verknüpft werden (und nur diesen). Die kann man relativ leicht im kopf hexadezimal addieren statt über bits nach zu denken, und so sparst du dir das umrechnen ins Dezimalsystem.
0x02 + 0x10 + 0x30 = 0x02 | 0x10 | 0x30 = 0x32
Falls eine Stelle über 9 läuft, musst du mit ABCDEF weiter denken:
0x02 + 0x04 + 0x08 = 0x02 | 0x04 | 0x08 = 0x0E

Mathematik dahinter: Solange du nur mit Zahlen rechnest, die untereinander keine Bits an der gleichen stelle haben (also z.B. 010 + 101, aber nicht 011 + 010), ist ein bitweises OR gleich wie eine Addition, weil immer nur nullen mit nullen oder nullen mit einsern addiert/ge-ORt werden.
 
Zurück
Oben