Я использую этот код отсюда: Чтение и выполнение шелл-кода из файла . текстовый файл
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <stdlib.h>
int main(void)
{
FILE *file = fopen("text.txt", "r");
unsigned char *buf;
int length = 0;
struct stat st;
int v;
// get file size and allocate. We're going to convert to bytes
// from text, so this allocation will be safely large enough
fstat(fileno(file), &st);
buf = valloc(st.st_size);
while (fscanf(file, "\\x%02x", &v) == 1)
{
buf[length++] = v;
}
fclose(file);
mprotect(buf, length, PROT_EXEC);
int (*ret)() = (int (*)())buf;
ret();
return 0;
}
И я компилирую с помощью: gcc -fno-stack-protector -z execstack testshell.c -o testshell
Он работает нормально, но исполняемый им шелл-код пишет в терминал, но я хотел бы каким-то образом перенаправить его в файл.
Я попытался:
./testshell > output.txt
но, похоже, не смог получить и это, чтобы зафиксировать результаты шелл-кода.
Как я могу перехватить вывод любого запущенного шеллкода и, если возможно, перенаправить его в файл?
Обновление: Шеллкод, который я использую, выводит вывод системного вызова sys_write в файловый дескриптор (вычисляет и выводит на экран) -
\xeb\x4d\x5e\x66\x83\xec\x0c\x48\x89\xe0\x48\x31\xc9\x68\x33\x09\x00\x7c\x48\x89\xcf\x80\xc1\x0c\x40\x8a\x3e\x40\xf6\xd7\x40\x88\x38\x48\xff\xc6\x68\x16\x96\xd0\xd9\x48\xff\xc0\xe2\xea\x2c\x0c\x48\x89\xc6\x68\xf2\xf5\x44\x48\x48\x31\xc0\x48\x89\xc7\x04\x01\x48\x89\xc2\x80\xc2\x0b\x0f\x05\x48\x31\xc0\x04\x3c\x0f\x05\xe8\xae\xff\xff\xff\x85\xa7\xaa\xc7\x9e\x87\xa5\xa5\x8e\xb7\x87\xba\x31\x80\xe0\x55\xef\xa1\x93\x0c\x4e\x1c\xdc\x34\x53\xb3\x8b\x43\x48\x68\x30\x1d\x4b\x65\x5b\x52\x41\x4e\x44\x53\x54\x52\x32\x5d
fscanf
формат"\\x%02x"
является избыточным и вводит в заблуждение. Должно быть"\\x%2x"
- person chqrlie   schedule 12.04.2015./testshell > output.txt 2>&1
для перенаправления как stdout, так и stderr наoutput.txt
. - person David C. Rankin   schedule 12.04.2015fprintf
, но перенаправление как stderr, так и stdout ничего не делает. Это похоже на использование ядра printf. - person David C. Rankin   schedule 12.04.2015stdin
,stdout
,stderr
), но в таком случае шелл-код в целом тоже. - person Jonathan Leffler   schedule 12.04.2015./testshell > output.txt 0>&1
работал нормально. Обучение произошло... Спасибо. Это первый и, надеюсь, последний раз, когда я сталкиваюсь с этим. Я слишком стар, чтобы учиться этим трюкам. - person David C. Rankin   schedule 12.04.2015./testshell > output.txt 0>&1
Добавьте это как решение, и я отмечу его правильным и решенным! - person user2059300   schedule 12.04.2015