Difference between revisions of "LU-LSP-b13:L09"

From DiLab
Jump to: navigation, search
(New page: === Praktiskais darbs #9 - steka satura analīze un piekļuve stekam. === * [http://www.codeproject.com/KB/windows/CallStackTest/StackLayout2.jpg Steka kadra uzbūve x86 arhitektūrā]. ...)
 
 
(4 intermediate revisions by one other user not shown)
Line 1: Line 1:
=== Praktiskais darbs #9 - steka satura analīze un piekļuve stekam. ===
=== Praktiskais darbs #9.1 - steka satura analīze un piekļuve stekam. ===


* [http://www.codeproject.com/KB/windows/CallStackTest/StackLayout2.jpg Steka kadra uzbūve x86 arhitektūrā].
* [http://www.codeproject.com/KB/windows/CallStackTest/StackLayout2.jpg Steka kadra uzbūve x86 arhitektūrā].
Line 5: Line 5:
* Funkciju izsaukumu analīze. printf() lietošana steka satura izdrukai.
* Funkciju izsaukumu analīze. printf() lietošana steka satura izdrukai.


* Koda disasamblēšana ar ''objdump'' vai '''gdb'' programmām.
* Koda disasamblēšana ar ''objdump'' vai ''gdb'' programmām.
objdump -dS <binary-file> | less


* Piekļuve reģistru saturam caur inline asamblera kodu.
* Piekļuve reģistru saturam caur inline asamblera kodu.
Line 13: Line 14:
==== Iesūtīšana ====
==== Iesūtīšana ====


Šis PD ir opcionāls.
Šis PD nav obligāts, nav jāiesūta.


Uzdevumi:
Uzdevumi:
Line 23: Line 24:
==== Programmas kods ====
==== Programmas kods ====


Kompilēt ar opcijām "-g -fno-stack-protector"
<pre>
<pre>
#include <stdio.h>
#include <stdio.h>
Line 33: Line 35:
gets(s);
gets(s);
printf("%s\n", s);
printf("%s\n", s);
}

int main(void) {
f();
return 0;
}
</pre>


Modificēts kods:
<pre>
#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define GET_EBP_VALUE(result) \
asm volatile("movl %%ebp, %0\n" : "=m" (result))

#define GET_ESP_VALUE(result) \
asm volatile("movl %%esp, %0\n" : "=m" (result))

uint32_t esp, ebp;

void f(void) {
GET_EBP_VALUE(ebp);
printf("%p\n", (void *) ebp);

char s[16];
gets(s);
printf("%s\n", s);

asm("leave");
GET_ESP_VALUE(esp);
*(uint32_t *) esp = f;
asm("pop %eax");
asm("push %eax");
asm("jmp %eax");
}
}



Latest revision as of 23:01, 17 March 2020

Praktiskais darbs #9.1 - steka satura analīze un piekļuve stekam.

  • Funkciju izsaukumu analīze. printf() lietošana steka satura izdrukai.
  • Koda disasamblēšana ar objdump vai gdb programmām.
objdump -dS <binary-file> | less
  • Piekļuve reģistru saturam caur inline asamblera kodu.
#define GET_EBP_VALUE(result) \
    asm volatile("movl %%ebp, %0\n" : "=m" (result))

Iesūtīšana

Šis PD nav obligāts, nav jāiesūta.

Uzdevumi:

1) Panākt, ka f() izsauc sevi izmantojot steka pārpildi (bez ASM koda).

2) Panākt, ka f() veiksmīgi izsauc funkciju system() ar argumentu "touch file.txt", izmantojot steka pārpildi

Programmas kods

Kompilēt ar opcijām "-g -fno-stack-protector"

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void f(void) {
    char s[16];
    gets(s);
    printf("%s\n", s);
}

int main(void) {
    f();
    return 0;
}


Modificēts kods:

#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define GET_EBP_VALUE(result)				\
     asm volatile("movl %%ebp, %0\n" : "=m" (result))

#define GET_ESP_VALUE(result)				\
     asm volatile("movl %%esp, %0\n" : "=m" (result))

uint32_t esp, ebp;

void f(void) {
    GET_EBP_VALUE(ebp);
    printf("%p\n", (void *) ebp);

    char s[16];
    gets(s);
    printf("%s\n", s);

    asm("leave");
    GET_ESP_VALUE(esp);
    *(uint32_t *) esp = f;
    asm("pop %eax");
    asm("push %eax");
    asm("jmp %eax");
}

int main(void) {
    f();
    return 0;
}