feat(print.s): unpadding WIP
This commit is contained in:
parent
c9d07e22a9
commit
78ff534aee
26
print.s
26
print.s
|
@ -15,6 +15,11 @@ _start:
|
||||||
mov rbx, rsi
|
mov rbx, rsi
|
||||||
sub rbx, qword [rel text_section] ;text_section address because of this and that
|
sub rbx, qword [rel text_section] ;text_section address because of this and that
|
||||||
mov r8, qword [rel section_size] ;text_section size
|
mov r8, qword [rel section_size] ;text_section size
|
||||||
|
shr r8, 2
|
||||||
|
inc r8
|
||||||
|
inc r8
|
||||||
|
inc r8
|
||||||
|
inc r8
|
||||||
mov r9, 0 ;increment register
|
mov r9, 0 ;increment register
|
||||||
mov r10, 0 ;increment register
|
mov r10, 0 ;increment register
|
||||||
xor r10, r10
|
xor r10, r10
|
||||||
|
@ -78,7 +83,25 @@ _start:
|
||||||
sub rax, 42 ; remove 42 of result (avoid 0 values)
|
sub rax, 42 ; remove 42 of result (avoid 0 values)
|
||||||
sub rax, r10 ; remove index of result (caesar like cypher so 0/42 values are differents)
|
sub rax, r10 ; remove index of result (caesar like cypher so 0/42 values are differents)
|
||||||
; unpadding and write back here
|
; unpadding and write back here
|
||||||
;mov [rbx + r9], rax
|
mov dword [rbx + r9], 0
|
||||||
|
mov rcx, r10
|
||||||
|
mov r15, r10
|
||||||
|
shr r15, 5
|
||||||
|
shl r15, 2
|
||||||
|
inc rcx
|
||||||
|
shl rcx, 59
|
||||||
|
shr rcx, 59
|
||||||
|
shl rax, cl
|
||||||
|
mov r14, r9
|
||||||
|
sub r14, r15
|
||||||
|
add [rbx + r14], eax
|
||||||
|
mov rcx, rax
|
||||||
|
shr rcx, 32
|
||||||
|
cmp r9, 0
|
||||||
|
je first_block_skip
|
||||||
|
add [rbx + r14 - 4], ecx
|
||||||
|
|
||||||
|
first_block_skip:
|
||||||
; unpadding and write back here
|
; unpadding and write back here
|
||||||
pop rax
|
pop rax
|
||||||
add r9, 4
|
add r9, 4
|
||||||
|
@ -93,7 +116,6 @@ _start:
|
||||||
pop r12 ; pop rsa.n
|
pop r12 ; pop rsa.n
|
||||||
pop r12 ; pop rsa.d
|
pop r12 ; pop rsa.d
|
||||||
|
|
||||||
|
|
||||||
pop r15
|
pop r15
|
||||||
pop r14
|
pop r14
|
||||||
pop r13
|
pop r13
|
||||||
|
|
|
@ -10,21 +10,35 @@ unsigned long encrypt(char *file, unsigned long int offset, unsigned long int si
|
||||||
}
|
}
|
||||||
(void)rsa;
|
(void)rsa;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
while (i < size) {
|
while (i < (size + 4)) {
|
||||||
|
/*if (i < 8) {
|
||||||
|
printf("%x\n", file[offset+i]);
|
||||||
|
}*/
|
||||||
size_t j = 0;
|
size_t j = 0;
|
||||||
|
size_t tool = i % 4;
|
||||||
|
int tool2 = 0;
|
||||||
|
if (tool == 0) {
|
||||||
|
tool2 = 3;
|
||||||
|
} else if (tool == 1) {
|
||||||
|
tool2 = 1;
|
||||||
|
} else if (tool == 2) {
|
||||||
|
tool2 = -1;
|
||||||
|
} else {
|
||||||
|
tool2 = -3;
|
||||||
|
}
|
||||||
|
|
||||||
while (j < 8) {
|
while (j < 8) {
|
||||||
size_t bit_index = i * 8 * sizeof(char) + j;
|
size_t bit_index = i * 8 + j;
|
||||||
//printf("bit_index : %ld\n", bit_index);
|
//printf("gonna encrypt index %lu\n", offset + bit_index / 8);
|
||||||
padded[bit_index / 31] += (1 & (file[bit_index / 8] >> j)) << (bit_index % 31);
|
padded[bit_index / 31] += (1 & (file[offset + bit_index / 8 + tool2] >> (7 - j))) << (30 - bit_index % 31);
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
//file[offset + i] = file[offset + i] - 1;
|
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < padded_len; i++) {
|
for (size_t i = 0; i < padded_len; i++) {
|
||||||
printf("block : %x\n", padded[i]);//, padded[i]);
|
printf("block : %x\n", padded[i]);
|
||||||
padded[i] = pow_mod(padded[i] + 42 + i, 11317, rsa.n);
|
padded[i] = pow_mod(padded[i] + 42 + i, 11317, rsa.n);
|
||||||
printf("encrypted block : %x\n\n", padded[i]);//, padded[i]);
|
printf("encrypted block : %x\n\n", padded[i]);
|
||||||
//printf("decipher block : %lu (%lx)\n", pow_mod(padded[i], rsa.d, rsa.n) - 42 - i, pow_mod(padded[i], rsa.d, rsa.n) - 42 - i);
|
//printf("decipher block : %lu (%lx)\n", pow_mod(padded[i], rsa.d, rsa.n) - 42 - i, pow_mod(padded[i], rsa.d, rsa.n) - 42 - i);
|
||||||
}
|
}
|
||||||
memcpy(&file[offset], padded, padded_len * sizeof(uint32_t));
|
memcpy(&file[offset], padded, padded_len * sizeof(uint32_t));
|
||||||
|
|
16
srcs/woody.c
16
srcs/woody.c
|
@ -103,9 +103,9 @@ int insert_payload(t_elf_content *woody, t_payload *payload, size_t payload_posi
|
||||||
{
|
{
|
||||||
(void)rsa;
|
(void)rsa;
|
||||||
//printf("salut %s\n", JUMP_VALUE);
|
//printf("salut %s\n", JUMP_VALUE);
|
||||||
for (size_t i = 0; i < payload->len; i++) {
|
/*for (size_t i = 0; i < payload->len; i++) {
|
||||||
printf("%c", *(payload->payload + i));
|
printf("%c", *(payload->payload + i));
|
||||||
}
|
}*/
|
||||||
char *ptr_jmp_value = ft_strnstr_nullterminated(payload->payload, JUMP_VALUE, payload->len);
|
char *ptr_jmp_value = ft_strnstr_nullterminated(payload->payload, JUMP_VALUE, payload->len);
|
||||||
char *ptr_woody = ft_strnstr_nullterminated(payload->payload, WOODY, payload->len);
|
char *ptr_woody = ft_strnstr_nullterminated(payload->payload, WOODY, payload->len);
|
||||||
char *ptr_text_section = ft_strnstr_nullterminated(payload->payload, TEXT_OFFSET, payload->len);
|
char *ptr_text_section = ft_strnstr_nullterminated(payload->payload, TEXT_OFFSET, payload->len);
|
||||||
|
@ -113,17 +113,23 @@ int insert_payload(t_elf_content *woody, t_payload *payload, size_t payload_posi
|
||||||
char *ptr_section_size = ft_strnstr_nullterminated(payload->payload, SECTION_SIZE, payload->len);
|
char *ptr_section_size = ft_strnstr_nullterminated(payload->payload, SECTION_SIZE, payload->len);
|
||||||
if (ptr_jmp_value && ptr_woody && ptr_text_section && ptr_section_size && ptr_private_key)
|
if (ptr_jmp_value && ptr_woody && ptr_text_section && ptr_section_size && ptr_private_key)
|
||||||
{
|
{
|
||||||
|
printf("payload position %ld (%lx)\n", payload_position, payload_position);
|
||||||
|
printf("ptr_woody : %p\n", ptr_woody);
|
||||||
|
printf("ptr_section_size: %p\n", ptr_section_size);
|
||||||
|
printf("ptr_text_section : %p\n", ptr_text_section);
|
||||||
|
printf("ptr_jmp_value : %p\n", ptr_jmp_value);
|
||||||
|
printf("ptr_private_key: %p\n", ptr_private_key);
|
||||||
int32_t woody_index = ptr_woody - payload->payload;
|
int32_t woody_index = ptr_woody - payload->payload;
|
||||||
int32_t jmp_index = ptr_jmp_value - sizeof(JUMP) - payload->payload;
|
int32_t jmp_index = ptr_jmp_value - sizeof(JUMP) - payload->payload;
|
||||||
int32_t jump_value = ((payload_position + jmp_index + 5) - woody->Ehdr->e_entry) * -1; // 5 = JUMP SIZE (OPCODE + 4 bytes operand)
|
int32_t jump_value = ((payload_position + jmp_index + 5 - 1) - 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 - 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->Phdr[load_segment_index].p_offset + woody_index;
|
int64_t text_value = payload_position - woody->Phdr[load_segment_index].p_offset + woody_index;
|
||||||
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 = woody->Phdr[load_segment_index].p_memsz; //woody->text_section->sh_size;
|
int64_t section_value = woody->Phdr[load_segment_index].p_memsz * 33/32 + 1; //woody->text_section->sh_size;
|
||||||
ft_memcpy(&payload->payload[section_index], §ion_value, sizeof(section_value));
|
ft_memcpy(&payload->payload[section_index], §ion_value, sizeof(section_value));
|
||||||
|
|
||||||
int64_t private_key_index = ptr_private_key - payload->payload;
|
int64_t private_key_index = ptr_private_key - payload->payload;
|
||||||
|
|
Loading…
Reference in New Issue