⇽ Neueste 4 EinträgeEinträge 7 bis 4 ⇾

Trampolinspringen mit gcc

2006年01月04日 (水曜日) 04時20分
Tags: Hecking

Als jemand der auf Windows (bzw. DOS) mit Programmieren angefangen hat empfand ich unter POSIX-Systemen immer das dauernde gepipe (und damit verbunden: geparse) am schlimmsten. Und wenn mir das jetzt ernsthaft irgendwer als gut verkaufen will darf er sich den Sourcecode des RIPE-whois angucken. (den Teil mit der GPG-Anbindung)

Quasi als Windows-Nachwirkung benutze ich sehr gern libdl und eine handvoll .so-Dateien. Nur hat man da wiederum das Problem, dass fehlerhafte Module die ganze Applikation zum Absturz bringen können. Unter Windows kann man COM-Objekte in separaten Adressräumen laufen lassen, und wenn das SEGVed kracht halt das COM-Objekt weg, aber nicht die ganze Anwendung. Ich dachte sehr lange, unter GNU/Linux müsste man die selbe Methodik nachbauen - also Threads benutzen - bis mir auf einer Zugfahrt vor paar Wochen die Idee zu dem Code hier gekommen ist:

loader.c:
static int callmod(int op)
{
	__label__ out;
	struct sigaction new, oldsegv, oldbus;
	int rv = 0;

	void sigh(int sig, siginfo_t *si, void *info)
	{
		fprintf(stderr, "sig%d accessing %p in module\n",
			sig, si->si_addr);
		rv = 0xDEADBEEF;
		goto out;
	}

	new.sa_sigaction = sigh;
	new.sa_flags = SA_SIGINFO | SA_RESETHAND | SA_NODEFER;
	sigemptyset(&new.sa_mask);

	sigaction(SIGSEGV, &new, &oldsegv);
	rv = fn(op);
out:
	sigaction(SIGSEGV, &oldsegv, NULL);
	return rv;
}

(Wer das auf Anhieb verstanden hat braucht den Rest nicht mehr zu lesen.)

Dass das ganze überhaupt geht, ermöglicht etwas gcc-Magic - verschachtelte Funktionen (void sigh(...)) gibt es leider in ANSI-/ISO-C nicht. Der Trick ist, dass gcc aus solchen Funktionen in die enthaltende Funktion herausspringen kann, von wo aus wir dann normal weiterarbeiten können.

Zur Umsetzung des ganzen verwendet gcc Trampolines, denen grsecurity-Benutzer vielleicht schon begegnet sind. Als Trampoline wird hier Code bezeichnet, der auf den Stack geschoben wird sobald man die Adresse der inneren Funktion haben will.

Die Problematik ist hier, dass die innere Funktion nicht direkt per Adresse des Codes aufgerufen werden kann. Zum Aufruf der Funktion benötigt man nicht wie normalerweise eine Information - die Adresse der Funktion - sondern zwei Informationen: ihre Adresse und die Adresse des Stack-Frames der äusseren Funktion. Es müssen also zwei Informationen in eine gequetscht werden. Das geschieht, indem man zur Laufzeit die Adresse des Stackframes zusammen mit dem Aufruf der eigentlichen Funktion auf den Stack schiebt, und dann die Adresse dieses Fetzchens übergibt.

Die Adresse des Stack-Frames der äusseren Funktion wird im Normalfall genutzt, um von der inneren Funktion auf lokale Variablen der äusseren Funktion zuzugreifen, also im Codebeispiel die Zuweisung von 0xDEADBEEF an rv. In diesem Fall wird sie jedoch für etwas anderes benutzt: als "Save-Point" nach dem Absturz. Falls nun also irgendwo weiter unten im Code eine SEGV auftritt, kann man den Stack der aufgerufenen Funktionen abwerfen und zum definierten Punkt (__label__ out) mit intaktem Stack zurückkehren.

Trampolin-Erzeugung und resultierender Code:
mov  eax, offset sigh
lea  rcx, [rsp+496]
lea  rdx, [rsp+524]
mov  word [rdx],     0bb41h
mov dword [rdx+2], eax
mov  word [rdx+6],   0ba49h
mov qword [rdx+8], rcx
mov  word [rdx+16],  0ff49h
mov  byte [rdx+18],  0e3h

und als Ergebnis hat man auf dem Stack:

41 bb ????????          mov r11, 0x????????          # sigh
49 ba ????????????????  mov r10, 0x????????????????  # frame
49 ff e3                jmp [r11]
Stack als Grafik

Ein Allheilmittel ist das hier allerdings nicht. Sollte ein Stack Overflow passieren oder globale Variablen verändert werden, ist der "Save-Point" wertlos...

Chaotic Congress

2005年11月10日 (木曜日) 20時37分
Tags: CCC, Netbeat

It's November again, and together with christmas, there is something else approaching: 22C3.» Along with it, the debate about the so-called "professionalisation" usually rises up as well. As far as I'm informed, this year's issue of that debate ended some while ago.

While I certainly do not want to stir all that mess up again, an interesting factor of it occured to me. It came as an offspring of a lively conversation with Astro» about myths related to the admission fee. In that conversation, we noticed that we have a stunningly different opinion about what the congress actually is.

These different opinions are probably illustrated best by extremising them. One of the extrema is a snobby high-class limited-visitors security conference. The other one is a community event along the lines of the EasterHegg. While not putting it to the ultimate, Astro was primarily seeing the Congress as a really good security conference. I, on the other hand, was emphasising the community aspect.

At first, those two views may sound like being a mile apart. I thought so at the beginning, but after a while I came to the conclusion that they actually aren't, and that this is a major difference between the hacking subculture and other academics-related subcultures. What I mean by that is probably represented best by comparing what's happening outside the speeches. Unlike on a conference about theoretical physics, you'll find some interesting stuff to see and to do outside the conference rooms, may it be WRT soldering, lockpicking or breaking stuff in contests.

Admittedly, each visitor will set his own priorities on what to attend. But we're still talking about a hacker conference, and I think this is the only thing keeping us from becoming a conference of mighty snobs. I also think this is the key to understanding the disputes arising around the "professionalisation" of the Congress. The only Congress I attended is 21C3, so I can only guess, but I'm assuming the balance of past Congresses was shifted much more to the other side. (Correct me if I'm wrong.)

Anyway, the conclusion I've drawn from this is much more straightforward: the Congress needs a manifesto. The thing is, from the fact that I myself misunderstood the purpose of the Congress quite a bit, I'm cheeky enough to assume that other people might fall for the same misunderstanding. And that, if true, definitely is not a good thing.

Ah, the price - I think for a good conference like the one I'm expecting the 22C3 to be, a price in the realms of high two-digit Euros is really, really worth it. And I'm definitely going to attend it. Keep up the good work, guys ;)

BGP: Mit Route-Maps besser selektieren

2005年11月07日 (月曜日) 23時52分
Peeringschema in diac24.net

« Das ist ein Ausschnitt aus der Netzwerkstruktur von diac24.net. Dargestellt sind Astro (64616)», toidinamai (64612)», der SpaceBoyZ (64624)» und meine Wenigkeit (64602).

Ohne irgendwelche weitergehende Konfiguration besteht zwischen den beiden tiefschwarzen Pfaden im Bild keine besondere Präferenz. Nach "first-comes" würde die Route selektiert, die als erste da war. (oder beide - Multipath.)

Astros Internetanbindung ist nun aber nicht gerade die schönste, und er bekommt auch noch Traffic darauf abgerechnet. Da wäre es natürlich sinnvoll, um ihn herumzurouten. Werfen wir also einen Blick auf die gängige Selektionspraxis für Routen».

Mein Ziel ist, möglichst wenig über Astro zu routen. D.h. ich will notfalls auch längere Pfade in Kauf nehmen, damit das nicht über Astros Leitung prasselt. Also bleiben als Auswahlkriterium die Punkte 1 bis 3 auf der Liste, da Punkt vier schon die AS-Pfadlänge ist und mir die ja egal sein soll. Punkt 3 fällt auch weg, da man darauf wenig Einfluss hat. Bleiben also weight und local preference.

Der Unterschied zwischen den beiden ist, dass weight router-lokal ist. Da ich aber 2 Router in meinem AS habe, ist mir local preference lieber, die wird über iBGP-Peerings mit ausgetauscht. Schreiten wir also zur Tat:

tethys' bgpd.conf, Version 1:
router bgp 64602
 neighbor fe80::209:5bff:fe2f:ee50 route-map astro in

route-map astro permit 20
 set local-preference 25
Pfade mit bgpd.conf Version 1

Sieht doch schon mal ganz gut aus. Konfiguration auf tethys geschmissen (in der Skizze der untere rechte Knubbel in AS64602), und los ging's...

...scheint zu funktionieren, bis auf eine Kleinigkeit, die im Bild rechts an den rot markierten aktiven Pfaden deutlich wird. Die Pakete zu Astro (64616) nehmen einen Unnötigen Umweg über den SBZ (64624).

Bedenkt man die Konfiguration recht, ist das auch wenig verwunderlich - der Pfad über den SBZ hat mit der Default-preference von 100 einfach Vorrang gegenüber der direkten Route, die ja auf 25 herunterkonfiguriert ist. Ein Blick in show ip bgp bestätigt die Theorie:

Ergebnis nach bgpd.conf, Version 1:
*  172.22.12.0/24   172.22.16.1                    25      0 64616 64612 i
*>i                 172.22.24.1                   100      0 64624 64612 i
*  172.22.16.0/23   172.22.16.1                    25      0 64616 i
*>i                 172.22.24.1                   100      0 64624 64616 i

Für toidinamai (AS64612) funktioniert das ganze schon mal super. Aber die im Bild gestrichelte direkte Route zu Astro wird nicht selektiert. Also, noch mal überarbeiten:

tethys' bgpd.conf, Version 2:
router bgp 64602
 neighbor fe80::209:5bff:fe2f:ee50 route-map astro in

ip as-path access-list astroown permit 64616$

route-map astro permit 10
 match as-path astroown

route-map astro permit 20
 set local-preference 25
Pfade mit bgpd.conf Version 1

Um die zweite Konfiguration zu verstehen, muss man wissen, dass route-maps nach dem ersten Treffer aufhören. Über AS-Path-Matching erwischt der erste route-map-Eintrag also alles, was seinen Ursprung bei Astro hat, und beendet dafür das Matching. Dadurch behalten die Routen die Default-preference von 100.

Und zur Demonstration, dass das ganze wie erwartet funktioniert:

Ergebnis nach bgpd.conf, Version 2:
*  172.22.12.0/24   172.22.16.1                    25      0 64616 64612 i
*>i                 172.22.24.1                   100      0 64624 64612 i
*> 172.22.16.0/23   172.22.16.1                   100      0 64616 i
* i                 172.22.24.1                   100      0 64624 64616 i

Durch die gleiche preference kommt der Auswahlalgorithmus jetzt bis zum AS-Pfadlängenvergleich. Dabei gewinnt die direkte Route dank kürzeren Pfades, womit das heutige Klassenziel erreicht ist.

Für Informationen, auf was man sonst noch mit route-map matchen kann, sei auf die Dokumentation zu route-map» und zu ip as-path» verwiesen. Über communities gibts bald noch mal einen extra Post.

P.S.: Sorry an Astro fürs Zerlegen des Harvester-Layouts».

Scary Movie...

2005年10月28日 (金曜日) 01時21分
Copyright © 2005, 2006, 2007 by David L. (equinox)
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.0 Germany License
Creative Commons License

Impressum

      mode   index
      uri    
      offset 4