Если вам просто нужно получить MAC-адреса для системы и подключиться к интерфейсу, мы можем сделать это с помощью Bash и передать его программе C. Если мы посмотрим в /sys/class/net/*/
, то увидим, что имя интерфейса содержится в файле uevent
, а MAC-адрес находится в файле address
; поэтому мы можем объединить эти два файла вместе для каждого интерфейса. Примечание. :Мой bash не самый красивый, возможно, есть лучший способ сделать это.
[user@headdesk eth0]$ cat /sys/class/net/*/uevent /sys/class/net/*/address | grep -v IFINDEX | column | sed 's/INTERFACE=//'
eth0 fa:16:3e:ac:48:74
lo 00:00:00:00:00:00
Поскольку вы запрашиваете исполняемый стек, размещение вашего кода в нем сделает его исполняемым:
int main() {
const char shellcode[] = "\x48\x31\xc0\xb0\x3c\x48\x31\xff\x48\x83\xf7\x01\x0f\x05";
(*(void(*)())shellcode)();
}
Кроме того, вы можете изменить защиту страницы на странице (с ), содержащей шелл-код:
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
const char shellcode[] = "\x48\x31\xc0\xb0\x3c\x48\x31\xff\x48\x83\xf7\x01\x0f\x05";
int main() {
long page_size = sysconf(_SC_PAGESIZE);
void *page_start = (void *) ((long) shellcode & -page_size);
if (mprotect(page_start, page_size * 2, PROT_READ | PROT_EXEC)) {
perror("mprotect");
} else {
(*(void(*)())shellcode)();
}
}
Весь смысл изменений, подобных найденному вами , заключается в исправлении целых классов уязвимостей. Даже с описанным выше подходом вы не сможете внедрить код в запущенный процесс и выполнить его, если процесс в какой-то степени не «взаимодействует» (, запрашивая исполняемые стеки ).