<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://andromeda.df.lu.lv/wiki/index.php?action=history&amp;feed=atom&amp;title=LU-LSP-b%3AL09b</id>
	<title>LU-LSP-b:L09b - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://andromeda.df.lu.lv/wiki/index.php?action=history&amp;feed=atom&amp;title=LU-LSP-b%3AL09b"/>
	<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=LU-LSP-b:L09b&amp;action=history"/>
	<updated>2026-04-20T02:40:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=LU-LSP-b:L09b&amp;diff=8744&amp;oldid=prev</id>
		<title>Leo: Created page with &quot;=== Praktiskais darbs #9.b - steka satura analīze un piekļuve stekam. ===  * [http://www.codeproject.com/KB/windows/CallStackTest/StackLayout2.jpg Steka kadra uzbūve x86 ar...&quot;</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=LU-LSP-b:L09b&amp;diff=8744&amp;oldid=prev"/>
		<updated>2020-03-17T21:02:47Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;=== Praktiskais darbs #9.b - steka satura analīze un piekļuve stekam. ===  * [http://www.codeproject.com/KB/windows/CallStackTest/StackLayout2.jpg Steka kadra uzbūve x86 ar...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== Praktiskais darbs #9.b - steka satura analīze un piekļuve stekam. ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.codeproject.com/KB/windows/CallStackTest/StackLayout2.jpg Steka kadra uzbūve x86 arhitektūrā].&lt;br /&gt;
&lt;br /&gt;
* Funkciju izsaukumu analīze. printf() lietošana steka satura izdrukai.&lt;br /&gt;
&lt;br /&gt;
* Koda disasamblēšana ar &amp;#039;&amp;#039;objdump&amp;#039;&amp;#039; vai &amp;#039;&amp;#039;gdb&amp;#039;&amp;#039; programmām.&lt;br /&gt;
 objdump -dS &amp;lt;binary-file&amp;gt; | less&lt;br /&gt;
&lt;br /&gt;
* Piekļuve reģistru saturam caur inline asamblera kodu.&lt;br /&gt;
 #define GET_EBP_VALUE(result) \&lt;br /&gt;
     asm volatile(&amp;quot;movl %%ebp, %0\n&amp;quot; : &amp;quot;=m&amp;quot; (result))&lt;br /&gt;
&lt;br /&gt;
==== Iesūtīšana ====&lt;br /&gt;
&lt;br /&gt;
Šis PD nav obligāts, nav jāiesūta.&lt;br /&gt;
&lt;br /&gt;
Uzdevumi:&lt;br /&gt;
&lt;br /&gt;
1) Panākt, ka f() izsauc sevi izmantojot steka pārpildi (bez ASM koda).&lt;br /&gt;
&lt;br /&gt;
2) Panākt, ka f() veiksmīgi izsauc funkciju system() ar argumentu &amp;quot;touch file.txt&amp;quot;, izmantojot steka pārpildi&lt;br /&gt;
&lt;br /&gt;
==== Programmas kods ====&lt;br /&gt;
&lt;br /&gt;
Kompilēt ar opcijām &amp;quot;-g -fno-stack-protector&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void f(void) {&lt;br /&gt;
    char s[16];&lt;br /&gt;
    gets(s);&lt;br /&gt;
    printf(&amp;quot;%s\n&amp;quot;, s);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    f();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificēts kods:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define GET_EBP_VALUE(result)				\&lt;br /&gt;
     asm volatile(&amp;quot;movl %%ebp, %0\n&amp;quot; : &amp;quot;=m&amp;quot; (result))&lt;br /&gt;
&lt;br /&gt;
#define GET_ESP_VALUE(result)				\&lt;br /&gt;
     asm volatile(&amp;quot;movl %%esp, %0\n&amp;quot; : &amp;quot;=m&amp;quot; (result))&lt;br /&gt;
&lt;br /&gt;
uint32_t esp, ebp;&lt;br /&gt;
&lt;br /&gt;
void f(void) {&lt;br /&gt;
    GET_EBP_VALUE(ebp);&lt;br /&gt;
    printf(&amp;quot;%p\n&amp;quot;, (void *) ebp);&lt;br /&gt;
&lt;br /&gt;
    char s[16];&lt;br /&gt;
    gets(s);&lt;br /&gt;
    printf(&amp;quot;%s\n&amp;quot;, s);&lt;br /&gt;
&lt;br /&gt;
    asm(&amp;quot;leave&amp;quot;);&lt;br /&gt;
    GET_ESP_VALUE(esp);&lt;br /&gt;
    *(uint32_t *) esp = f;&lt;br /&gt;
    asm(&amp;quot;pop %eax&amp;quot;);&lt;br /&gt;
    asm(&amp;quot;push %eax&amp;quot;);&lt;br /&gt;
    asm(&amp;quot;jmp %eax&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    f();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
</feed>