问题标签 [code-size]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
596 浏览

assembly - 在已知地址重用字符串以节省字节并减少 shellcode 有效负载的大小

编辑:免责声明 - 这仅用于教育目的,因为我正在尝试在 x86 asm 中学习 shellcoding - 这不是以任何方式编写野外漏洞利用的帮助请求。


基本上我在这里所要求的 - 无论我要求的“为什么”是学习如何获取存储在内存中的已知信息,例如:

并在我的 asm 代码中重新使用存储在该地址的信息。我会执行 lea eax,[address] 吗?我已经尝试了很多事情,但没有任何结果导致存储在该地址空间中的信息按预期显示。


--- original-ish post--- 我正在使用 Windows 32 位的 POC shellcode x86 asm。我已经模糊了一个远程应用程序,并且能够执行代码 - 例如: http ://shell-storm.org/shellcode/files/shellcode-482.php

我注意到崩溃后的连接地址(攻击地址)始终位于调试器转储中显示的相同硬编码地址空间中:

我想使用上面的 shell-storm cmd.exe shellcode,但以某种方式将包含我的 ASCII IP 地址的地址空间传递给它,以便下载/运行 rundll32.exe 漏洞利用。我将如何去引用地址空间(它确实包含空的第一个字节)并将它在 x86 asm 中传递给 cmd.exe?

这只是我用来执行代码的示例。它也适用于 cmd.exe。基本上在第 4 行和第 5 行,我将“calc.exe”作为 8 个字节的纯文本传递,如果您将进行十六进制编码。我想修改它以基本上执行 rundll32 而不是 calc 或 cmd where

以上只是我插入我在内存中观察到的硬编码 IP 的地方。

在上面的示例代码段中,我将如何在第 4-5 行中插入位于前面提到的内存地址的 ASCII 值?这是我关于 x86 asm 的问题的真正内容。我会使用memcpy吗?字符串?我是一个新手,绝对不是 asm 的日常实践者。

0 投票
2 回答
628 浏览

assembly - 使用 x86 或 x86_64 程序集反转字符串的最简洁方法是什么?

我希望以尽可能少的汇编代码来反转字符串。

由于缺乏Unicorn支持,我只能使用 SSSE3 扩展或更少。我试过访问 ymm & zmm 指令,但每次都会中断。

尽管 SSSE3 指令更简洁,但pshufb用于对 128 位 XMM 寄存器进行字节反转的 16 字节控制向量仍然占用 16 字节并且使其更长。我对任何想法持开放态度,但以下是我的最佳尝试。

我需要 32 字节或更少,越小越好。到目前为止,我得到的最好的是 42,但那是我假设 rdx(如果使用 x86,则为 ecx)中的字符串大小为 30。

理想情况下,它将能够通过检查空终止符来动态获取大小。

字符串地址位于 rdx 内部(如果使用 x86,则为 ecx)。

附加限制:不使用堆栈空间。此代码块必须在没有 RSP 指向可用堆栈内存的情况下运行。


标准 x86 / 64 - 42 字节

SSE3 - 62 字节(因为是字节数组,否则为 46)

0 投票
2 回答
750 浏览

assembly - 为什么使用 `xor` 比使用 `mov` 需要更少的字节?

对于将 x 设置为零(x = 0),我的 csapp 书指出了两种方法。

第一的:

第二:

它还告诉第一个只占用 3 个字节,但第二个占用 7 个字节。

这两种方式是如何工作的?为什么第一个比第二个占用更少的字节?

0 投票
1 回答
362 浏览

c - 在 Code Composer Studio 编译器中禁用 64 位除法

我目前正在使用 Code Composer Studio (CCS) V7.4.0.00015 用 C 语言编写程序。该程序有几个自写的库,可以执行字节、无符号整数和浮点除法。

我已经到了项目的那个阶段,我需要减少代码大小以确保有足够的空间来容纳引导加载程序。

查看我的 .map 文件可以发现 CCS 自动包含的几个运行时支持对象。其中一些包括以下内容:

  • div64u.obj--> 846 字节
  • div64s.obj--> 316 字节

这些对象来自rts430x_lc_sd_eabi.lib

我的问题是:为什么要包含这些 64 位除法对象(尤其是当我的程序中没有任何 64 位浮点数时)?更重要的是,我可以禁用它们(或阻止 CCS 包含它们)吗?

我花了几天时间在谷歌上搜索并搜索不同的站点,但我找不到关于这些对象或如何禁用它们的太多文档。

编辑: 事实证明我确实有一个使用长整数的函数(typedef'd as SLLONG)

新问题:

  • 任何人都可以想出一种方法来重新排列函数,使其不需要使用长整数(不会导致任何精度损失?)
  • 或者更具体地说,任何人都可以弄清楚我如何以不同的方式进行长长除法,即如下所示的行:
0 投票
1 回答
12 浏览

macos - 将源提取到静态库会增加大小

我刚刚将一堆源代码提取到了几个静态库中,以使项目更加结构化,并且主要可执行文件的二进制大小增加了约 150kb。这让我很困惑,所以我用三个文件制作了一个小项目:

在我制作了两个可执行文件和一个静态库之后:

它们的大小相差约 2kb(~31kbtest_no_lib和 ~33kb test_with_lib,在 macos 上使用 clang 11 编译,-Os 优化,所有符号都被剥离)。

这是为什么?静态库不应该只是目标文件的存档,如果需要,链接器会获取这些目标文件吗?为什么它也增加了尺寸?它不是很多,但它仍然让我感到惊讶,为什么它不是免费的?

0 投票
1 回答
221 浏览

performance - 8085 汇编程序的时钟周期和内存使用情况

我有一个用汇编语言编写的小程序,它可以对数字进行平方。

关于这个程序,我有几个问题。

如果每个存储单元恰好存储一个字节的信息,则第一个任务是确定将程序部分存储在存储器中所需的程序存储单元的数量。第二个任务是确定运行程序需要多少时钟周期。

这里的逻辑是什么?我将如何计算这些东西?我完全不明白这一点,任何帮助将不胜感激。干杯。

0 投票
2 回答
858 浏览

assembly - 各汇编指令指令长度表

我需要给出 1 字节指令长度到 13 字节指令的汇编命令列表:

  • 1 字节:推,...
  • 2 字节:添加 al, ...
  • 3 字节:添加 ax, ...
  • .
  • .
  • .
  • 13 字节...

我在哪里可以找到这样的清单?
我可以看到汇编命令和指令长度(以字节为单位)。

0 投票
0 回答
37 浏览

generics - 特征默认函数实现是否会像泛型一样导致代码膨胀?

我偶然发现了这个有趣的代码示例

在 C++ 中,如果这是一个基类而不是 trait,call_foo_twice则只会编译一次,但它会动态调度对 的调用foo,它本身将被声明为虚拟的。

如果这些foo调用是在 Rust 中静态分派的,这表明call_foo_twice将为实现的每个类型重新编译,Bar因为每个类型都有自己唯一的foo. 这个对吗?对于我更喜欢​​减少编译时间而不是提高性能的情况,是否应该使用一个成语?

0 投票
0 回答
132 浏览

c - 为什么一个简单的 C 程序会消耗大量磁盘空间?

我注意到打印“hello world”的简单 C 程序的大小:

大约是8kB。我认为这可能是因为包含,然后我生成了一个更简单的程序:

但再次编译程序的大小约为 8kB。

为什么这么大?如果一条机器指令是 8B,那么大约有 1k 条指令,但我看不出有任何理由为什么这么简单的代码会导致这么多指令。

0 投票
1 回答
89 浏览

c++ - C++ 编译器对模板类的代码大小有多聪明?

考虑以下代码:

从根本上说,没有理由为 S 的每个值创建长度函数和下标运算符的单独副本。但我担心实际上每个不同的 S 值都会重复这些函数,从而限制了它的有用性方法。

(如果你好奇我为什么不使用 std::vector,那是因为这是一个没有任何基于堆的内存分配的嵌入式应用程序)