Difference between revisions of "LU-LSP-b13:L09"
(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 |
* 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 |
Š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;
}