如何在PHP/Python中进行缓冲区溢出攻击?

8

以下是C语言的一个例子:

#include <stdio.h>
#include <string.h>

void bad() {
    printf("Oh shit really bad~!\r\n");
}

void foo() {
    char overme[4] = "WOW";
    *(int*)(overme+8) = (int)bad;
}

int main() {
   foo();
}
6个回答

11

Python和PHP像其他人建议的一样是解释性语言并不是重点。重点是它们几乎所有的API和语言语义都经过了严格的错误检查,因此不可能具有可利用的未定义行为。即使你编译这些语言,也仍然不可能。这并不意味着你不能暴露不安全的API,可以做任何事情。实际上,使用Python的ctypes模块应该可以创建类似的行为,但要通过意外操作实现会更加困难。


2

由于PHP是一种脚本语言,没有指针,并且字符串类型是二进制安全的,这些东西在PHP中不起作用。

但是为什么你会想做这样的事情呢?

(哦,可能会有PHP中的漏洞导致缓冲区溢出,但这在任何情况下都不能依赖,并且通常会很快得到修复...)


2
我们很抱歉:您已经触及了Python的一个弱点。不幸的是,这是设计上的问题,所以很难解决。也许您应该继续使用C语言。

正如Martin v. Löwis所说:

很抱歉,Python不支持缓冲区溢出。

PS哇,看起来我好像几个月前读过那篇文章,但实际上已经过去7年零一天了。


1

在PHP中做类似的事情不会产生相同的行为。

PHP是解释性的,并且始终检查您正在执行的操作是否有效。因此,您不能 - 例如 - 超出缓冲区。


1
由于 PHP、Python 和其他解释型语言首先必须通过解释器,而且您无法完全访问内存,这种类型的语言将不允许您编写像您发布的代码那样的某些游戏。

0
import sys
import socket

for carg in sys.argv:

    if carg == "-S":

        argnum= sys.argv.index(carg)

        argnum +=1

        host = sys.argv[argnum]

    elif carg == "-p":

        argnum = sys.argv.index(carg)

        argnum +=1

        port = sys.argv[argnum]

buffer = "\x41"* 3000

s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host,port))

s.send("USV" + buffer)

s.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接