问题标签 [shellcode]
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.
c++ - 通过强制转换为 Visual C++ 中的函数指针来执行 shellcode
在 gcc 中,这工作正常。代码类似于:
但是当它被放入 Visual C++ 中时,它会吐出以下错误消息:
有谁知道为什么会这样?
assembly - shellcode中的空字节?
我认为 shellcode 中不允许空字节。在了解一些 shellcode 的同时,我似乎遇到了一些包含 null 并且运行良好的代码,这是为什么呢?
assembly - 为什么堆栈开始的地址足够可预测以允许可重复利用但似乎不可预测?
我最近一直在自学编写漏洞利用程序和shellcode,许多指南/书籍声称我们可以猜测堆栈的开始位置,从而通过一些工作来猜测我们的 shellcode 从堆栈上的哪个地址开始。
- 为什么栈的起始地址是可预测的?堆栈不应该从内存中的某个随机地址开始吗?
- 如果堆栈的地址开始只是虚拟地址空间中的某个固定偏移量,那么为什么它会因机器而异?
- 不同平台和栈起始地址的误差范围是多少?
相关:“每个程序的堆栈都从相同的地址开始”,来自黑客的地址困境:利用的艺术,为什么堆栈地址会朝着减少内存地址的方向增长?
编辑对于我的测试,地址空间布局随机化(ASLR)已关闭。
c - C 中的 Shellcode - 这是什么意思?
我并没有真正了解这段代码是如何做的:
好的,我知道了:
设置一个 int 的指针。和:
设置 ret 和 2 个字节的地址(我认为。)
但我不明白这意味着什么:
我知道什么&ret
意思,但不知道什么(int *)&ret
意思。此外,它如何通过分配 to 的值shellcode
来执行 shellcode ret
?
更新:有什么区别:
和:
buffer-overflow - Shellcode开发,ESP指针
前一段时间,在 Windows XP SP3 ( http://www.exploit-db.com/exploits/9177/ )上对 Easy RM to MP3 Converter 2.7.3.700 进行利用时 ,我遇到了一个不理解的概念,它像这样:
用于生成恶意文件的 perl 脚本:
生成恶意文件后,将其输入转换器,然后他们分析 [esp+18] 处的堆栈内容(相对于 esp 的寻址)......为什么这些 A 在这里?
我是说 :
A 从 [ESP-88E8] 到 [ESP-43C]
B 从 [ESP-438] 到 [ESP-C]
C 在 [ESP-8]
那么为什么这些 A 又在 [ESP+18] 到 [ESP+418] ?当这些 A 已经从 [ESP-88E8] 到 [ESP-43C] 放置时,为什么这些 A 在 [ESP+18] 到 [ESP+418] 处重复 .. ??
谢谢你 。
c - 如何让c代码执行十六进制机器代码?
我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码。这是我拥有的 C 程序:
我试图运行的代码("\x48\x31\xc0"
)是我通过编写这个简单的汇编程序获得的(它不应该真正做任何事情)
然后对其进行编译和 objdump-ing 以获得字节码。
但是,当我运行我的 C 程序时,我遇到了分段错误。有任何想法吗?
c - 无法找出粉碎堆栈段错误
我最近在用“shellcoder's handbook”一书做一些非常棒的堆栈练习。
但是当我尝试在我的 Ubuntu11.04 上测试一些代码时,我总是会遇到段错误。
情况如下:
起初我写了 exit_shellcode.s (只是简单的 exit(0) 函数):
然后我得到十六进制代码:
之后我制作了 wack.c:
编译: gcc -mpreferred-stack-boundary=2 -ggdb -fno-stack-protector -o wack wack.c
但是当我运行它时收到段错误。
这是 gdb 结果:
shellcode 数组
在f中,ebp和ret=0x080483b7
经过一番si,ret=0x0804a010,就是shellcode数组的地址。
在一些 si 之后出现段错误,我无法理解。
你能帮我么?
security - 代码注入的旧时代结束了吗?
我想知道,既然所有更新的操作系统都通过 ASLR、Canary Checks 和其他此类方法防止堆栈和堆类型溢出,内存损坏漏洞是否仍然普遍存在?鉴于系统管理员有能力并保护系统免受暴力或 libc 攻击,老实说,我看不到许多其他方法。对于有人攻击系统,我唯一能想象的就是覆盖堆栈上的函数指针,但仅此而已。也许如果有人找到一种预测随机数的聪明方法,依赖随机结果的方案可能会被击败,但这似乎不太可能。现在看来,利用他人系统的唯一方法是欺骗 root 或管理员安装您的软件。代码注入的旧时代结束了吗?我'
linux - 为什么我的 shellcode 不起作用(在 Linux 中)?
我在下面写了一个小shellcode:
当shellcode运行时,它会返回6。实际上,上面的代码运行良好,main函数确实返回6。
然后我将代码嵌入到 C 程序中:
在正常情况下,代码应该返回 6。但它总是返回 0。
我不认为我的代码是错误的。我会告诉你的。
首先,我从 gdb 中得到 val ret 的地址:
我得到了 main 中下一条 call 指令的地址:
显然,它是 0x08048cd9。
然后,我得到将上面的地址存储在堆栈中的地址:
显然,地址是0xbffff2f8+0x04=0xbffff2fc。val ret 的地址是 0xbffff2f4。
所以,ret=(int *)&ret+0x08
应该得到正确的地址。并且*ret=(int *)shellcode
应该将shellcode的地址插入堆栈。然后程序运行到shellcode,最后程序返回时我得到6。
我错了吗?
我好像找错地方了:
指令add $0x20,%eax
很奇怪。这怎么可能发生?
assembly - 确保跳转的字母数字 Shellcode
我正在尝试编写一些最终以英文段落形式出现的 shellcode。这意味着我主要限于具有评估为字母数字字符或标点符号的操作码的指令。这实际上给我留下了许多不同的跳转指令,包括:、、、、、、、、、、、、、jo
和(对应于字母)。这些跳跃中的每一个在决定是否跳跃之前都会执行一次测试。在大多数情况下,我可以结合跳转加上它的逆来确保在 shellcode 中发生跳转(例如使用then或then ),但在. 测试为jno
jb
jae
je
jne
jbe
ja
js
jns
jp
p-z
jo
jno
je
jne
jb
jb
是CF=1
。
我的问题是,是否有任何一系列字母数字指令在功能上是 NOP,但也确保了这一点CF=1
? CF
是进位标志,因此任何保证设置进位标志的操作就足够了。
还保证了jae
,反正是保证了CF=0
?