7

这是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();
}
4

6 回答 6

11

像其他人建议的那样解释 Python 和 PHP 的事实实际上并不是重点。关键是它们公开的几乎所有 API 和语言语义都经过严格的错误检查,因此不可能有可利用的未定义行为。即使你编译这些语言,它仍然是不可能的。这并不意味着您不能公开可以做任何事情的不安全 API。事实上,使用 Python 的 ctypes 模块,应该可以创建类似的行为,但要意外地做到这一点要困难得多。

于 2010-01-17T15:47:54.497 回答
2

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

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

(哦,PHP中可能存在导致缓冲区溢出的错误,但这不是任何可以依赖的东西,而且通常会很快修复......)

于 2010-01-17T14:29:46.563 回答
2

很抱歉:您遇到了 Python 的弱点。不幸的是,这是设计使然,因此几乎无能为力。也许你应该留在 C.

正如 Martin v. Löwis所说

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

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

于 2010-01-17T22:26:30.013 回答
1

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

PHP 被解释并始终检查您正在执行的操作是否有效。所以您不能 - 例如 - 溢出缓冲区。

于 2010-01-17T14:30:38.267 回答
1

因为 php、python 和每一种解释语言首先都必须通过解释器,而你没有完全访问内存的权限,这种语言不会让你做一些像你发布的代码这样的游戏。

于 2010-01-17T14:38:36.157 回答
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()
于 2017-05-19T17:38:31.483 回答