Merge branch 'debug-double-packing'

This commit is contained in:
gbrochar 2024-04-17 09:02:51 +02:00
commit d7668b88a8
5 changed files with 16 additions and 11 deletions

1
gen_payload.sh Executable file
View File

@ -0,0 +1 @@
nasm -f elf64 -o print.o print.s && ld -o print print.o && nasm -f bin -o payload print.s && hexdump -v -e '"\\\x\" 1/1 "%02x"' payload

View File

@ -48,4 +48,5 @@ int prepare_injection(t_elf_content *woody);
// encrypt.c // encrypt.c
void encrypt(char *file, unsigned long int offset, unsigned long int size); void encrypt(char *file, unsigned long int offset, unsigned long int size);
#endif #endif

View File

@ -9,7 +9,7 @@ _start:
mov rdi, 1 mov rdi, 1
lea rsi, [rel msg] lea rsi, [rel msg]
mov rdx, 10 mov rdx, 14
mov rax, 1 mov rax, 1
syscall syscall
pop rdx pop rdx
@ -17,6 +17,7 @@ _start:
pop rdi pop rdi
pop rax pop rax
jmp 0x00000000 jmp 0x00000000
msg db "..WOODY..",10
msg db "....WOODY....",10
text_section dq 0xbabababababababa text_section dq 0xbabababababababa
section_sisze dq 0xcacacacacacacaca section_sisze dq 0xcacacacacacacaca

View File

@ -42,4 +42,5 @@ int main(int ac, char **av)
if (ret == EXIT_FAILURE) if (ret == EXIT_FAILURE)
return ret; return ret;
return prepare_injection(&woody); return prepare_injection(&woody);
} }

View File

@ -1,6 +1,5 @@
#include "../includes/woody.h" #include "../includes/woody.h"
int elf_magic_numbers(char *str) int elf_magic_numbers(char *str)
{ {
return (!ft_strncmp(str, ELFMAG, SELFMAG)); return (!ft_strncmp(str, ELFMAG, SELFMAG));
@ -111,14 +110,14 @@ int insert_payload(t_elf_content *woody, t_payload *payload, size_t payload_posi
printf("the jump = %ld\n", payload->len - 16); printf("the jump = %ld\n", payload->len - 16);
int32_t jmp_index = ptr_jmp - payload->payload; int32_t jmp_index = ptr_jmp - payload->payload;
int32_t jump_value = (payload_position - woody->Ehdr->e_entry + jmp_index - 1) * -1; int32_t jump_value = ((payload_position + jmp_index + 5) - woody->Ehdr->e_entry) * -1; // 5 = JUMP SIZE (OPCODE + 4 bytes operand)
ft_memcpy(&payload->payload[jmp_index + 1], &jump_value, sizeof(jump_value)); ft_memcpy(&payload->payload[jmp_index + 1], &jump_value, sizeof(jump_value));
int64_t text_index = ptr_text_section - payload->payload; int64_t text_index = ptr_text_section - payload->payload;
int64_t text_value = (payload_position - woody->text_section->sh_offset + text_index - 1) * -1; int64_t text_value = (payload_position - woody->text_section->sh_offset + text_index - 1) * -1;
text_value = 0; text_value = 0;
ft_memcpy(&payload->payload[text_index], &text_value, sizeof(text_value)); ft_memcpy(&payload->payload[text_index], &text_value, sizeof(text_value));
int64_t section_index = ptr_section_size - payload->payload; int64_t section_index = ptr_section_size - payload->payload;
int64_t section_value = (payload_position - woody->text_section->sh_size + section_index - 1) * -1; int64_t section_value = (payload_position - woody->text_section->sh_size + section_index - 1) * -1;
ft_memcpy(&payload->payload[section_index], &section_value, sizeof(section_value)); ft_memcpy(&payload->payload[section_index], &section_value, sizeof(section_value));
@ -127,7 +126,7 @@ int insert_payload(t_elf_content *woody, t_payload *payload, size_t payload_posi
printf("Old entry : %ld (%lx)\n", woody->Ehdr->e_entry, woody->Ehdr->e_entry); printf("Old entry : %ld (%lx)\n", woody->Ehdr->e_entry, woody->Ehdr->e_entry);
printf("Code cave start = %ld (%lx)\n", payload_position, payload_position); printf("Code cave start = %ld (%lx)\n", payload_position, payload_position);
printf("Payload size = %ld (%lx)\n", payload->len, payload->len); printf("Payload size = %ld (%lx)\n", payload->len, payload->len);
printf("Backwar d offset = %d (%x)(%x)\n", jump_value, jump_value, -jump_value); printf("Backward offset = %d (%x)(%x)\n", jump_value, jump_value, -jump_value);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
return EXIT_FAILURE; return EXIT_FAILURE;
@ -136,9 +135,9 @@ int insert_payload(t_elf_content *woody, t_payload *payload, size_t payload_posi
void inject(t_elf_content *woody) void inject(t_elf_content *woody)
{ {
t_payload *payload = get_payload(); t_payload *payload = get_payload();
int i = get_load_segment(woody, 0, true); int i = get_load_segment(woody, 0, true);
int j = get_load_segment(woody, i + 1, false); int j = get_load_segment(woody, i + 1, false);
size_t code_cave_size = woody->Phdr[j].p_offset - (woody->Phdr[i].p_offset + woody->Phdr[i].p_filesz); size_t code_cave_size = woody->Phdr[j].p_offset - (woody->Phdr[i].p_offset + woody->Phdr[i].p_filesz);
size_t payload_position; size_t payload_position;
printf("load position = : %ld (%lx)\n", woody->Phdr[i].p_offset, woody->Phdr[i].p_offset); printf("load position = : %ld (%lx)\n", woody->Phdr[i].p_offset, woody->Phdr[i].p_offset);
@ -205,6 +204,7 @@ int get_elf_sections(t_elf_content *woody)
break; break;
} }
} }
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -224,3 +224,4 @@ int prepare_injection(t_elf_content *woody)
free(woody_file); free(woody_file);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }