使用位图缓冲区时,例如:
[50, 50, 50, 255, 50, 50, 50, 255, ...]
[r, g, b, a, r, g, b, a, ...]
Run Code Online (Sandbox Code Playgroud)
我经常这样使用数学:
let bufferWidth = width * 4;
buffer.forEach((channel, index) => {
let y = Math.floor(index / bufferWidth);
let x = Math.floor((index % bufferWidth) / 4);
let remainder = index % 4;
Run Code Online (Sandbox Code Playgroud)
为了计算x,y或反之亦然,以使用位图数据的平面缓冲区。几乎总是我最终得到的结果是错误的,而以某种方式最终将它们的结果翻转回去,但是很明显,我对此有想法。
这种数学运算有什么问题,会导致位图被翻转?
完整代码,用于裁剪位图的函数:
function crop(
buffer,
width,
height,
leftLimit,
rightLimit,
lowerLimit,
upperLimit
) {
let croppedWidth = rightLimit - leftLimit;
let croppedHeight = upperLimit - lowerLimit;
let length = croppedHeight …Run Code Online (Sandbox Code Playgroud) 如果你们熟悉漏洞利用开发的基础知识,您就会知道,当您利用潜在的缓冲区溢出时,通常是为了找到“破坏”您想要修改的特定寄存器的缓冲区的偏移量,您会发送如下输入:
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
然后通过使用调试器并将发现的溢出到所需缓冲区位置的值传递到工具中,您将获得偏移量以了解从哪里开始插入有效负载。
使用仅支持 ELF 文件的 pwntools,这可以自动化,使用cyclic(200, n=8)和巧妙地跳过调试器步骤cyclic_find(core.read(core.rsp, 8), n=8)。这是一个完整的示例:
from pwn import *
elf = ELF("./exploit_this") # reminds the user that only ELFs are supported
p = process("./exploit_this")
p.sendline(cyclic(200, n=8))
p.wait()
core = p.corefile
print(cyclic_find(core.read(core.rsp, 8), n=8))
Run Code Online (Sandbox Code Playgroud)
但是,我无法(至少使用 pwntools)获取 PE 文件的核心文件。有没有其他方法可以用Python来实现呢?请注意,我并不是要求像 pwntools 那样抽象的方法,即使只是在 Python 中获取 corefile 也是我所需要的。我可以自己编写循环函数,没有问题。
编辑:您可能想先跳到问题的结尾,我已经在注释/答案中遵循了一些建议,并且当前错误与原始错误有所不同(可能与numpy有关)。
这个错误ModuleNotFoundError: No module named 'torch'以大量线程显示,我整天都在尝试解决方案。我将使用线程中建议的解决方案逐一进行故障排除步骤。
系统信息:Windows 10
我做的第一件事是按照Pytorch上的说明进行操作,安装Anaconda并使用正确的机器设置进行此操作(注意:在这些屏幕截图中尝试使用v3.8之前先尝试了Python v3.7,没有一种解决方案适用于此) :
如您所见,按照说明进行操作应该很好。
因此,我进入python终端并尝试导入pytorch,如下所示:
ModuleNotFoundError: No module named 'torch'太好了,那又如何?好吧,我将错误粘贴到Google并开始进行4小时的野鹅追逐。
第一个结果,堆栈溢出答案:没有名为“ Torch”的模块, 让我们尝试选择的答案,它需要一些与版本相关的语法,因此让我们检查我的python版本:
好吧,按照答案的指示:
尝试使用pip安装PyTorch:
首先使用以下命令创建一个conda环境:
Run Code Online (Sandbox Code Playgroud)conda create -n env_pytorch python=3.6
好:
使用以下方法激活环境:
Run Code Online (Sandbox Code Playgroud)source activate env_pytorch
那是行不通的,但是如果我们按照提示给出的指示进行激活,我们可以这样做:
现在使用pip安装PyTorch:
Run Code Online (Sandbox Code Playgroud)pip install torchvision --user ( this will install both torch and torchvision)
嗯..那在火焰中上升,所以以下...
现在转到python shell并使用以下命令导入:
Run Code Online (Sandbox Code Playgroud)import torch import torchvision
...没有做任何新的错误,和以前一样。
好吧,到下一个线程,在PyTorch GitHub上:https : //github.com/pytorch/pytorch/issues/4827
他们正在尝试使用Jupyter,所以我尝试了这,这是另一个漫长的过程,就像上述过程一样,我真的不想使用Jupyter,因此我们将跳过这一过程。
另一个Pytorch GitHub线程:https : //github.com/pytorch/pytorch/issues/12004
@edtky您能否在CMD中给我以下命令的输出?
哪里conda.exe哪里pip.exe哪里python.exe
当然,我会试一试:
@edtky看起来您有两个Python环境。请尝试在Anaconda Prompt中导入火炬。
哦,我已经做到了。没有布宜诺斯艾利斯。 …
尽管单词的常见定义(如维基百科所述)是:
用于指定存储器中的位置的最大可能地址大小通常是硬件字(这里,“硬件字”是指处理器的全尺寸自然字,而不是使用的任何其他定义)。
根据一些消息来源,x86 系统注意到它被视为 16 位:
在 x86 PC(Intel、AMD 等)中,虽然架构很早就支持 32 位和 64 位寄存器,但其本机字大小可以追溯到 16 位起源,“单个”字为 16 位。“双”字是 32 位。请参阅 32 位计算机和 64 位计算机。
然而英特尔的官方文档(sdm 第 2 卷,第 1.3.1 节)指出:
这意味着字的字节从最低有效字节开始编号。图 1-1 说明了这些约定。
图 1-1 显示了 x86-64 上下文中单词的小端序列中的 4 个字节,而不是 2 个字节或 8 个字节(如上面链接的来源的不同定义所建议的那样):
我对这一切真正感到困惑的是如何获取和解析指令。我正在编写一个模拟器,一旦我解析 PE 格式的可执行文件并进入文本部分,如果我要遵循 4 字节小端格式,这是否意味着将首先解析第 4 个字节?
让我们组成一些字节,例如:
.text segment buffer:
< 0x10, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20 > ....
Run Code Online (Sandbox Code Playgroud)
我会将第一条指令解析为 1C、1B、1A、10、20、1F、1E、1D ...(等等,由于长度可变,显然可能有更多的单词需要读取,具体取决于这里的实际字节是什么)?
我正在使用一个名为GPU.js的 JS 库。像这样使用:
const gpu = new GPU();
const multiplyMatrix = gpu.createKernel(function(a, b) {
let sum = 0;
for (let i = 0; i < 512; i++) {
sum += a[this.thread.y][i] * b[i][this.thread.x];
}
return sum;
}).setOutput([512, 512]);
Run Code Online (Sandbox Code Playgroud)
但是因为我不是通过像 CUDA 或 OpenGL 这样的低级协议来使用 GPU,而是通过几个抽象层,即 WebGL 之上的 GPU.js,我真的没有必要学习底层的基础知识到底如何矩阵运算在硬件上组装。
但是我注意到对于 GPU.js,每个 GPU 对我可以操作的矩阵的大小都有限制,通常限于 GPU 支持的最大屏幕分辨率。因此,如果我不得不猜测,我会认为我可以在 GPU 上一次并行执行的矩阵运算的最大数量是 7680 x 4320 x 3(宽 x 高 x 3 个颜色通道),例如 RTX 3080:
所以我猜我对那张卡的限制是:
.setOutput([7680, 4320, 3]);
Run Code Online (Sandbox Code Playgroud)
编辑:
这不可能是正确的,因为每一代 Nvidia GPU 的最大分辨率规格:1000、2000、3000 系列都保持不变,时钟速度也几乎保持不变,增加了 CUDA …
我需要在气隙网络上的 Python 和 JavaScript 之间进行 Web 套接字客户端服务器交换,所以我只能阅读和输入的内容(相信我,我很想能够运行pip install websockets)。这是 Python 和 JavaScript 之间的基本 RFC 6455 WebSocket 客户端-服务器关系。在代码下方,我将指出client.recv(1024)返回空字节文字的特定问题,导致 WebSocket 服务器实现中止连接。
客户:
<script>
const message = {
name: "ping",
data: 0
}
const socket = new WebSocket("ws://localhost:8000")
socket.addEventListener("open", (event) => {
console.log("socket connected to server")
socket.send(JSON.stringify(message))
})
socket.addEventListener("message", (event) => {
console.log("message from socket server:", JSON.parse(event))
})
</script>
Run Code Online (Sandbox Code Playgroud)
import array
import time
import socket
import hashlib
import sys
from select import select
import …Run Code Online (Sandbox Code Playgroud) 我正在做一些数据分析并发现:59932(0xea1c,定义为“填充”)作为一些 JPEG 图像中的 EXIF 标记。查了一下,我发现这个相同的标签在很多地方都存在。但这些实例都没有具体解释或提及该标签:
它存在于标签文档中作为填充,但我没有找到任何解释为什么会有填充作为元标签,或者在什么情况下会使用它,因为它似乎确实被使用。
它到处都在使用(主要是在较旧的图像文件中,但不限于此)。但我需要知道是什么原因导致它,并且找不到任何关于使用它的目的的参考,或者解释为什么有人使用它。这是一个非标准标签,但它在文档中被列为填充,因此某些组织/流行应用程序必须以这种方式定义它。
我想使用 ES6 导入语法构建一个 Electron 应用程序,这样我就可以在 Node.js 和浏览器端 JS 之间重用模块,而无需重复代码,但令人沮丧的是,我发现 Electron 在 ES6 语法支持方面落后于时代。
我了解了这个神奇的解决方案,却发现它不再被维护。
所以 Babel 来救援了,至少我是这么认为的。Google 在 Babel + Electron 教程主题上并没有取得太多成果。我还想加入 Nodemon。
这是我的设置:
包.json
{
"name": "infinitum",
"version": "1.0.0",
"description": "",
"main": "compiled.js",
"directories": {
"test": "tests"
},
"scripts": {
"start": " electron .",
"compile": "nodemon --exec babel-node app.js --out-file compiled.js"
},
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.12.10",
"@babel/node": "^7.12.10",
"@babel/preset-env": "^7.12.11",
"electron": "^11.1.0",
"nodemon": "^2.0.6"
}
}
Run Code Online (Sandbox Code Playgroud)
正如您将在以下输出和调试日志中看到的那样,这里的问题是我们正在尝试编译节点模块以使用 ES6 语法,但任何 Electron 应用程序都依赖于 Electron 模块,该模块似乎不导出传统方式,解析电子可执行路径(字符串)而不是 …
要在 Chart.js 饼图和甜甜圈图上获取标签,有一些插件可以这样做,例如:chartjs-plugin-labels但这样做之后我注意到我的 UI 设计存在一个大问题:
实际图表的大小会缩小,以便标签适合画布。标签需要能够适应它们呈现的画布,从而缩小图表,这是有道理的。但有时我可能会使用标签,而其他时候则不会,并且无论如何我都需要我的饼图呈现相同的大小。
无论是否应用标签,Chart.js(我使用的标签插件与 < 3.0 兼容,我使用的是 2.9)或 chartjs-plugin-labels 的设置中是否有解决方案来保持一致的图表大小?
我尝试对每个图表应用一个空标签,但图表的大小实际上会根据所呈现标签的特定大小而缩小,因此除了是一个hacky 解决方案之外,它并不能始终如一地解决均匀性问题。
例如,也许有一种方法可以让图表开始占据画布的 50%?
2018 年,谷歌的一位技术主管表示,他们正在努力在 64 位系统上的 V8 中“支持超过 4GiB 的缓冲区”。那发生了吗?
尝试将大文件加载到缓冲区中,例如:
const fileBuffer = fs.readFileSync(csvPath);
Run Code Online (Sandbox Code Playgroud)
在 Node v12.16.1 中并收到错误:
RangeError [ERR_FS_FILE_TOO_LARGE]: File size (3461193224) is greater than possible Buffer: 2147483647 bytes.
Run Code Online (Sandbox Code Playgroud)
在 Node v14.12.0(最新)中并得到错误:
RangeError [ERR_FS_FILE_TOO_LARGE]: File size (3461193224) is greater than 2 GB
Run Code Online (Sandbox Code Playgroud)
在我看来,这是由于用于缓冲区寻址的 32 位整数而设置的限制。但我不明白为什么这会成为 64 位系统的限制......是的,我意识到我可以使用流或从特定地址的文件中读取,但我有大量内存,而且我限制为 2147483647 字节,因为 Node 仅限于 32 位寻址?
当然,将高频随机访问数据集的缓冲区完全加载到缓冲区中而不是流式处理具有性能优势。指导请求从多缓冲区替代结构中提取的代码将花费一些成本,无论多小......
我可以使用该--max-old-space-size=16000标志来增加 Node 使用的最大内存,但我怀疑这是基于 V8 架构的硬限制。但是我仍然要问,因为 Google 的技术负责人确实声称他们将最大缓冲区大小增加到 4GiB 以上:2020 年有什么办法可以让 Node.js 中的缓冲区超过 2147483647 字节?
编辑,谷歌关于该主题的相关跟踪器,显然他们至少从去年开始就在努力解决这个问题:https : //bugs.chromium.org/p/v8/issues/detail?id=4153