<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Pointer verfälschen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>momentan befasse ich mich mit dem Thema Bufferoverflow und wie man sich davor am besten schützen kann. Konkret geht es um die Möglichkeit, Pointer vor möglichen Attacken zu schützen. Als kleine Demonstration möchte ich ein Miniprogramm dazu zeigen:</p>
<pre><code>int function_one(void) {
	return 1;
}

int function_two(void) {
	return 2;
}

int main(void) {

  	char buf[12];
 	int (*pointer)(void);

 	pointer = function_one;
	cout &lt;&lt; pointer();

  	return 0;
}
</code></pre>
<p>Nun frage ich mich, wie man durch einen Bufferoverflow meines &quot;buf&quot; den Funktionszeiger auf die Adresse der function_two umbiegen kann. Bis jetzt ist es mir nur geglückt, einen Segmentation Error zu kriegen, doch leider schaffe ich es nicht, die entsprechende Adresse an die enstprechende Stelle zu schreiben.</p>
<p>Kann mir dabei jemand helfen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316595/pointer-verfälschen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 20:48:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316595.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 May 2013 14:25:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 14:25:54 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>momentan befasse ich mich mit dem Thema Bufferoverflow und wie man sich davor am besten schützen kann. Konkret geht es um die Möglichkeit, Pointer vor möglichen Attacken zu schützen. Als kleine Demonstration möchte ich ein Miniprogramm dazu zeigen:</p>
<pre><code>int function_one(void) {
	return 1;
}

int function_two(void) {
	return 2;
}

int main(void) {

  	char buf[12];
 	int (*pointer)(void);

 	pointer = function_one;
	cout &lt;&lt; pointer();

  	return 0;
}
</code></pre>
<p>Nun frage ich mich, wie man durch einen Bufferoverflow meines &quot;buf&quot; den Funktionszeiger auf die Adresse der function_two umbiegen kann. Bis jetzt ist es mir nur geglückt, einen Segmentation Error zu kriegen, doch leider schaffe ich es nicht, die entsprechende Adresse an die enstprechende Stelle zu schreiben.</p>
<p>Kann mir dabei jemand helfen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322204</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Thu, 09 May 2013 14:25:54 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 14:49:37 GMT]]></title><description><![CDATA[<p>Das geht nur mit Sterne-Programmierung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int function_one(void) {
    return 1;
}

int function_two(void) {
    return 2;
}

int main(void) {

    char buf[12];
    int (*pointer)(void);

    pointer = function_one;

    *((int(**)())&amp;12[buf])=&amp;function_two;

    cout &lt;&lt; pointer();

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2322208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322208</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 09 May 2013 14:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 15:25:30 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
    *((int(**)())&amp;12[buf])=&amp;function_two;
    ...
}
</code></pre>
</blockquote>
<p>Wie darf man das mit <code>&amp;12[buf]</code> verstehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322217</guid><dc:creator><![CDATA[Mitlesender]]></dc:creator><pubDate>Thu, 09 May 2013 15:25:30 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 15:37:34 GMT]]></title><description><![CDATA[<p>Mitlesender schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
    *((int(**)())&amp;12[buf])=&amp;function_two;
    ...
}
</code></pre>
</blockquote>
<p>Wie darf man das mit <code>&amp;12[buf]</code> verstehen?</p>
</blockquote>
<p><a href="http://de.wikipedia.org/wiki/Nonsens" rel="nofollow">http://de.wikipedia.org/wiki/Nonsens</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322219</guid><dc:creator><![CDATA[aufklär0r]]></dc:creator><pubDate>Thu, 09 May 2013 15:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 15:48:33 GMT]]></title><description><![CDATA[<p>Ey, psst. Brauchst du gefälsches Pointer? Kommst du heute Nacht in Park. Bring ich billiges Pointer mit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322221</guid><dc:creator><![CDATA[Händler X]]></dc:creator><pubDate>Thu, 09 May 2013 15:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 16:25:19 GMT]]></title><description><![CDATA[<p>Mitlesender schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
    *((int(**)())&amp;12[buf])=&amp;function_two;
    ...
}
</code></pre>
</blockquote>
<p>Wie darf man das mit <code>&amp;12[buf]</code> verstehen?</p>
</blockquote>
<p>Ein Scherzchen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<pre><code>12[buf] == *(12+buf) == *(buf+12) == buf[12]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2322225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322225</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 09 May 2013 16:25:19 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 17:57:26 GMT]]></title><description><![CDATA[<p>Meine Frage war ernst gemeint!! Ich kriege es leider nicht hin, einfach mal &quot;pointer&quot; mit der Adresse der anderen Funktion durch einen Bufferoverflow zu überschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322256</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Thu, 09 May 2013 17:57:26 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 18:07:40 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Meine Frage war ernst gemeint!! Ich kriege es leider nicht hin, einfach mal &quot;pointer&quot; mit der Adresse der anderen Funktion durch einen Bufferoverflow zu überschreiben.</p>
</blockquote>
<p>Mein Code läuft bei mir und erzeugt die Ausgabe 2.<br />
Allerdings nur im Debug-Modus.</p>
<p>Im Release-Modus klappt er nicht. Vielleicht ist die Funktion da inline-expandiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322258</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 09 May 2013 18:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 18:11:16 GMT]]></title><description><![CDATA[<p>mmhh...vielleicht liegt da auch der Fehler bei mir. Ich stell mal alle Optimierungen aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322262</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Thu, 09 May 2013 18:11:16 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 18:19:17 GMT]]></title><description><![CDATA[<p>welchen Compiler verwendest Du und wie rufst Du ihn auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322264</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Thu, 09 May 2013 18:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 18:29:31 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>welchen Compiler verwendest Du und wie rufst Du ihn auf?</p>
</blockquote>
<p>unter windows den gcc, der bei mingw dabei war.<br />
-g -Wall -std=c++11 -fexceptions</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322269</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 09 May 2013 18:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 18:59:44 GMT]]></title><description><![CDATA[<p>schad...bei mir wird auch mit gcc sets 1 ausgeben. HAt jemand ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322274</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Thu, 09 May 2013 18:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 19:25:31 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>schad...bei mir wird auch mit gcc sets 1 ausgeben. HAt jemand ne Idee?</p>
</blockquote>
<p>Schau mal den assemblercode an.<br />
(Mit -save-temps compilieren, dann taucht die Datei auf.)<br />
Lass die beiden Funktionen sonderliche Zahlen returnen wie 4711 und 0815 (/*haha, einer meiner Lieblingswitze*/), damit man die magic numbers besser im Assembler-Code findet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322279</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 09 May 2013 19:25:31 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 19:46:50 GMT]]></title><description><![CDATA[<p>Der Compiler von ideone(C++11) legt mir den Funktionszeiger immer 'unten' auf den Stack, unabhängig von der Reihenfolge der Deklarationen (erst <code>buf[]</code> oder erst <code>pointer</code> ist egal), so daß ein Überlauf von <code>buf</code> ihn nicht erreichen kann. (Sicherheitsfeature?)<br />
Wenn man <code>buf[-4]</code> nimmt funktioniert es nur, wenn man den manipulierten <code>pointer</code> vor Benutzung einmal ausliest (bspw. <code>cout &lt;&lt; (void*) pointer;</code> ). Der liegt da wohl schon in einem Register. Ich hatte für die Tests übrigens aus buf[12] ein buf[16] gemacht. Keine Ahnung, ob das nötig war. EDIT: da es sich wohl um einen 32-Bit-Compiler handelt, dürfte das hier keine Bedeutung haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322283</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Thu, 09 May 2013 19:46:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 20:04:50 GMT]]></title><description><![CDATA[<p>aufklär0r schrieb:</p>
<blockquote>
<p><a href="http://de.wikipedia.org/wiki/Nonsens" rel="nofollow">http://de.wikipedia.org/wiki/Nonsens</a></p>
</blockquote>
<p><a href="http://de.wiktionary.org/wiki/Kommutativit%C3%A4t*" rel="nofollow">http://de.wiktionary.org/wiki/Kommutativität*</a> (nur für skalare Typen natürlich.)</p>
<blockquote>
<p>Im Release-Modus klappt er nicht. Vielleicht ist die Funktion da inline-expandiert.</p>
</blockquote>
<p>Edit³: Versteh jetzt erst den Trick <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322285</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 09 May 2013 20:04:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 19:54:59 GMT]]></title><link>https://www.c-plusplus.net/forum/post/2322286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322286</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 09 May 2013 19:54:59 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 20:04:05 GMT]]></title><description><![CDATA[<p>Ich habs: Der Stack wächst nach unten.</p>
<p>Das liegt wohl an der GCC-ABI.</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>freakC++ schrieb:</p>
<blockquote>
<p>schad...bei mir wird auch mit gcc sets 1 ausgeben. HAt jemand ne Idee?</p>
</blockquote>
<p>Schau mal den assemblercode an.<br />
(Mit -save-temps compilieren, dann taucht die Datei auf.)<br />
Lass die beiden Funktionen sonderliche Zahlen returnen wie 4711 und 0815 (/*haha, einer meiner Lieblingswitze*/), damit man die magic numbers besser im Assembler-Code findet.</p>
</blockquote>
</blockquote>
<p>Ich hab den Assembler-Code nicht angeschaut, aber wahrscheinlich wolltest du genau darauf hinaus, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322287</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 09 May 2013 20:04:05 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 20:03:17 GMT]]></title><description><![CDATA[<p>Und die Lösung lautet:</p>
<pre><code>int main()
{
    char buf[12];
    int (*pointer)();

    pointer = function_one;

    std::cout &lt;&lt; &amp;buf &lt;&lt; &amp;pointer &lt;&lt; '\n';

    *((int(**)())&amp;buf[-sizeof(pointer)]) = function_two;

    std::cout &lt;&lt; pointer();
}
</code></pre>
<p>Edit²: Wtf? Es klappt nur, wenn man die Adressen nimmt und ausgibt. Auch volatile gilt nicht (as-if)!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322288</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 09 May 2013 20:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 20:19:49 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Wtf?</p>
</blockquote>
<p>Wir bewegen uns außerhalb des Standards.<br />
Siehe &quot;nasal demons&quot;.<br />
Da muss man halt fummeln uns ausprobieren. Und die nächste Compilerversion macht es ganz anders.</p>
<p>edit: Bitte die demnächst vollständige main.cpp posten, damit man leichter damit experimentieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322294</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 09 May 2013 20:19:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 20:23:43 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>Der Compiler von ideone(C++11) legt mir den Funktionszeiger immer 'unten' auf den Stack, unabhängig von der Reihenfolge der Deklarationen (erst <code>buf[]</code> oder erst <code>pointer</code> ist egal), so daß ein Überlauf von <code>buf</code> ihn nicht erreichen kann. (Sicherheitsfeature?)</p>
</blockquote>
<p>Kann ich mir nicht vorstellen, da der Compiler ja nicht in die Zukunft schauen kann. Was macht er denn, wenn noch n bissl Code dazwischen steht? Oder ist das libsafe?</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Und die Lösung lautet:</p>
</blockquote>
<p>Cool danke! Klappt bei mir ohne die Ausgabe der Adressen. Ich schau mir aber morgen auch erst noch einmal den Assemblercode an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Viele Grüße<br />
freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322300</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Thu, 09 May 2013 20:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Thu, 09 May 2013 20:28:46 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Was macht er denn, wenn noch n bissl Code dazwischen steht?</p>
</blockquote>
<p>Das hat damit <strong>nichts</strong> zu tun. Es geht um die lokalen Variablen auf dem Stack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322305</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Thu, 09 May 2013 20:28:46 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Fri, 10 May 2013 00:15:01 GMT]]></title><description><![CDATA[<p>Also bei mir geht</p>
<pre><code>int main(void) { 

    char buf[12]; 
    int (*pointer)(void); 

    pointer = function_one; 
    sprintf(buf,&quot;1234567890ab\x10\x10\x40\x00&quot;);
    std::cout &lt;&lt; pointer(); 

    return 0; 
}
</code></pre>
<p>Bei Visual Studio und</p>
<p>- Puffersicherheitsüberprüfung deaktivert<br />
- Funktionslevellinking deaktiviert<br />
- Optimierungen deaktiviert<br />
- Zufällige Basisadresse (ASLR) deaktiviert</p>
<blockquote>
<p>Der Compiler von ideone(C++11) legt mir den Funktionszeiger immer 'unten' auf den Stack, unabhängig von der Reihenfolge der Deklarationen (erst buf[] oder erst pointer ist egal), so daß ein Überlauf von buf ihn nicht erreichen kann. (Sicherheitsfeature?)</p>
</blockquote>
<p>Ja das ist ein Sicherheitsfeature dass manche Compiler Arrays immer so angelegt werden dass keine Pointer oder andere lokale Variablen überschrieben werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322343</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Fri, 10 May 2013 00:15:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Fri, 10 May 2013 07:30:33 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>Das hat damit <strong>nichts</strong> zu tun. Es geht um die lokalen Variablen auf dem Stack.</p>
</blockquote>
<p>Vielleicht vertehe ich dich falsch, aber stell dir vor, dass ganz oben auf dem Stack ein Pointer liegt. Jetzt im Nachhinein will ich irgendeinen Buffer drauflegen. Die Reihenfolge kann nur geändert werden, wenn bereits zur Compilierzeit bekannt ist, welche Pointer und überlauffähigen Konstrukte es geben wird. Sonst müsste der Compiler zur Laufzeit den Pointer erst wieder vom Stack runternehmen, dann den Buffer drauflegen und erneut den Zeiger pushen. Das bezweifel ich.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Ich habs: Der Stack wächst nach unten.</p>
</blockquote>
<p>Wie rum man den Stack betrachtet, ist eigentlich egal. In meinem Kopf wächst er immer nach oben. Hauptsache deine Vorstellung ist konsistent. Wenn Du vom Stack also subtrahierst, wächst er noch weiter nach oben bzw. bei dir nach unten.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Und die Lösung lautet:</p>
<pre><code>//...

    *((int(**)())&amp;buf[-sizeof(pointer)]) = function_two;
//...
</code></pre>
</blockquote>
<p>Ehrlich gesagt, habe ich noch ein bisschen Schwierigkeiten mit diesem Ausdruck. Warum brauce ich den Dopelzeiger?</p>
<p>Vielen Dank für eure Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322369</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Fri, 10 May 2013 07:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Fri, 10 May 2013 08:11:39 GMT]]></title><description><![CDATA[<p>Einen Doppelzeiger brauchst du, weil du in <code>&amp;buf[..]</code> einen Zeiger auf einen Funktionszeiger speichern möchtest.<br />
Die erste Indirektion ist einfach der Funktionszeiger an sich - der Wert, den wir speichern wollen, ist diese Adresse. Die Zweite Indirektion bezieht sich auf den Zeiger, mit dem wir die gewünschte Byte-Sequenz überschreiben möchten ( &amp;buf[-8] o.ä. ).</p>
<p>Wenn du diesen dann Dereferenzierst, speicherst du den eigentlichen Zeiger in einem &quot;Arrayelement&quot;*.</p>
<p>*Natürlich kein Element des Arrays, aber naja</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322377</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 10 May 2013 08:11:39 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Fri, 10 May 2013 09:18:05 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ich habs: Der Stack wächst nach unten.</p>
<p>Das liegt wohl an der GCC-ABI.</p>
</blockquote>
<p>Breaking News. Das wird doch heutzutage auf praktisch allen Plattformen gängigerweise so gemacht. Auf vielen CPUs lässt sich auch ein aufsteigender Stack recht bequem realisieren, praktisch schreiben aber viele Calling-Conventions/ABIs etwas anderes vor.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>Wie rum man den Stack betrachtet, ist eigentlich egal. In meinem Kopf wächst er immer nach oben. Hauptsache deine Vorstellung ist konsistent.</p>
</blockquote>
<p>Schon richtig, vorstellen kannst du dir das, wie auch immer du möchtest oder wie du die Vorgänge am besten nachvollziehen kannst. Dennoch ist es nicht gänzlich egal. Der Unterschied liegt eben darin, ob später auf den Stack geschobene Elemente eine höhere oder eine niedrigere Adresse haben als die vorigen. Aber auch das reicht noch nicht aus. Eigentlich müsstest du auch noch wissen, ob du bei einer Push-Operation den Stackpointer zuerst inkrementierst/dekrementierst und dann schreibst oder zuerst schreibst und dann den Stackzeiger manipulierst. Man spricht dabei von einem &quot;vollen&quot; oder &quot;leerem&quot; Stack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322383</guid><dc:creator><![CDATA[frollo]]></dc:creator><pubDate>Fri, 10 May 2013 09:18:05 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer verfälschen on Fri, 10 May 2013 10:35:06 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Die Reihenfolge kann nur geändert werden, wenn bereits zur Compilierzeit bekannt ist, welche Pointer und überlauffähigen Konstrukte es geben wird.</p>
</blockquote>
<p>Was soll da unbekannt sein? Du hast den Quelltext geschrieben, der Compiler hat ihn gelesen. Er kennt alle Variablen und baut sich seinen Stackframe wie er ihn braucht - zur Compilezeit.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>Wie rum man den Stack betrachtet, ist eigentlich egal.</p>
</blockquote>
<p>Nicht, wenn Du solche Spielchen mit Überlauf zur Manipulation machen willst. Da mußt Du schon genau wissen, was passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322390</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Fri, 10 May 2013 10:35:06 GMT</pubDate></item></channel></rss>