Hallo Zusammen,
in einem Level von https://stripe.com/blog/capture-the-flag geht es
darum, einen strcpy-Buffer-Overflow auszunutzen. Ich kann bereits die
Rücksprungadresse beliebig verbiegen, auch auf den Inhalt des Puffers
(um aus diesem eigenen Code auszuführen). Unter der Fuchtel vom GDB
funktioniert das auch so wie's soll. Doch lässt man das Programm 'in der
freien Wildbahn' (ohne GDB) laufen gibt's nen Segfault an der Adresse,
die angesprungen wurde. Es sei anzumerken, dass nach dem strcpy GDB den
Stack für kaputt hält, das Springen funktioniert aber, denn der
instruction pointer steht am Sprungziel.
Der kernel schreibt dabei
1 | level04[7282]: segfault at ffffce80 ip 00000000ffffce80 sp 00000000ff90cdf0 error 14
|
Aus der arch/x86/mm/fault.c geht hervor
1 | /*
|
2 | * Page fault error code bits:
|
3 | *
|
4 | * bit 0 == 0: no page found 1: protection fault
|
5 | * bit 1 == 0: read access 1: write access
|
6 | * bit 2 == 0: kernel-mode access 1: user-mode access
|
7 | * bit 3 == 1: use of reserved bit detected
|
8 | * bit 4 == 1: fault was an instruction fetch
|
9 | */
|
Wir haben haben es hier also mit den Fehlerbits 2 und 4 zu tun. Bit 2
ist logisch, doch was hat es mit 'fault was an instruction fetch' auf
sich? Was wirklich nützliches dazu habe ich nicht gefunden.
MfG, Lukas