问题标签 [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 - Shellcode c语言
为什么程序员对这个字符串使用十六进制编码?例如,为什么使用\x31
第一个字符而不是1
?
c - C 缓冲区中的指令仅作为 sudo 执行
我正在研究 Aleph One 的文章Smashing the Stack for Fun and Profit中描述的缓冲区溢出攻击。
正如文章中所建议的,我编写了一个程序 (shellcode.c),将恶意代码 (shellcode) 植入到环境变量 ($EGG) 中。之后 $EGG 作为参数传递给我希望攻击的程序 (vulnerable.c),导致该程序中的缓冲区溢出并导致 shellcode 的执行。
这就是缓冲区的样子——
[NNNNNNNN...NNNNNNSSSSSS...SSSSSSSRRRRR...RRRRRR]
其中 N 是 NOP 指令(参见NOP sled), S 是我的 shellcode, R 是地址(将地址返回到缓冲区中,这将导致指令指针从代码段跳转到上面的堆栈缓冲区并开始执行指令)。
当我以普通用户的身份运行 shellcode.c 和vulnerable.c 的可执行文件时,我面临以下问题 -当指令指针被重定向到缓冲区并遇到指令时,会导致分段错误。但是,在以 sudo 执行程序时,缓冲区中的指令执行没有任何问题,并且缓冲区中的后续 shellcode 成功执行,从而启动了根终端,从而完成了漏洞利用。谁能解释为什么会发生这种情况?
我禁用了以下保护 - Stack Smashing Protection、ASLR和Linux 的 NX(eXecute Disable Bit)。
我正在使用 gcc 4.4.3(目标:i486-linux-gnu)编译并在运行内核 2.6.32 的 Ubuntu 10.04(Lucid Lynx)上执行。
以下是我的两个程序:
易受攻击的.c
外壳代码.c
memory - 使用 shellcode 修改内存中的一个字节
我一直在尝试创建一个简单的 shell 代码块,它允许我通过做一些简单的事情来修改一个字符串,比如改变一个字母,然后打印出来。
它应该打印出“你好世界”。当我尝试使用mov
这样的命令修改一个字节的内存时,就会出现问题(段错误)。
mov byte [esi+1], 41
我通过 GDB 运行了该程序,并且该pop esi
命令正常工作,esi
加载了字符串的地址,并且一切都有效。我不明白为什么我不能修改有效地址的字节值。我只是通过运行由 NASM 和 ld 生成的可执行文件来测试这个“shellcode”,我还没有把它放在 C 程序或任何东西中,所以程序集中存在错误。
额外的信息
我正在使用带有以下构建命令的 x64 Linux:
delphi - 如何获取编译时已知的汇编指令的机器代码?
我希望能够将一行 ASM 转换为 shellcode。IE:
我该如何去做,并且能够正确地转换这个 shellcode,以便我可以将它存储在一个 delphi 应用程序的变量中。IE:
shellcode - Shell代码打印字符(64位)
我对这个 shell 代码有疑问。当我运行汇编代码时,它会打印字符,但是当我从 c 调用它作为函数时它不会。我使用 gdb 测试了所有执行的指令,它似乎执行了所有指令。这很奇怪,因为我同时调试了 asm 和 c 版本,它们的功能相同,但是在 int 0x80 中,它不会为 C 代码打印任何内容。这是C代码:
这是 nasm 代码:
编辑:我已经解决了这个问题。在这个网页中:http ://www.exploit-db.com/papers/13065/我发现在 64 位中,系统调用必须使用 int 0x80 的 syscall insted 调用,并且参数的寄存器不同。然后我找到了另一个网页:http ://cs.lmu.edu/~ray/notes/linuxsyscalls/ 。它有一些关于做这些系统调用的例子,认为这是一个很好的网页。
但现在的问题是,为什么它可以与 Nasm 代码一起使用?是否与兼容性有关?可能是因为汇编器检测到 int 0x80 指令而汇编器代码在兼容模式下运行,而在 C 语言中编译器无法解释,因为它无法解释 shellcode?
我把工作的 C 代码留在这里:
assembly - execve shellcode 写入分段错误
我正在尝试研究 execve shellcode,
操作系统:Linux bt 2.6.39.4
root@bt:~/exploit# cat gshell.s
root@bt:~/exploit# as -gstabs -o gshell.o gshell.s
root@bt:~/exploit# ld -o gshell gshell.o
root@bt:~/exploit# ./gshell 分段错误(核心转储) root@bt:~/exploit#
广发银行:
(gdb) break *_start Breakpoint 1 at 0x8048054: 文件 gshell.s,第 6 行。
(gdb) r 启动程序:/root/exploit/gshell
程序收到信号 SIGSEGV,分段错误。shell () at gshell.s:14 14 movb %al,9(%esi)
(gdb) 打印 /x $esi $1 = 0x804807a (gdb) x/16cb $esi 0x804807a : 47 '/' 98 'b' 105 'i' 110 'n' 47 '/' 98 'b' 97 'a' 115 's' 0x8048082 : 104 'h' 65 'A' 68 'D' 68 'D' 68 'D' 68 'D' 67 'C' 67 'C' (gdb)
从上面的输出看来我已经成功地将 /bin/sh 地址放入 ESI 寄存器但是当我尝试将 0 移动到 9(%esi) --> 它会导致分段错误。甚至试图修改这个程序:movl $0 to $esi。想知道是否限制在 0x804807a 地址写入?哪个导致这个故障?以及如何继续成功运行这个 shellcode
谢谢,小杰克
c - 内联汇编中 Visual C 2010 中的访问冲突
我有一个简单的 C 语言程序,带有编译器开关:/GS-
这只是将 EIP 更改为机器代码字符串位置的概念证明。
假设我们设置 EIP = 0x012f5000,这会将 EIP 置于以下数组的地址:
char code[] = "\x00\x00\x8B\x00\x00";
我不确切知道这些指令会做什么,但 x00 指令似乎是 noops。将 EIP 切换到程序中的任何其他位置似乎会导致问题,但是当我将 EIP 指向该数组的地址时,我会在 EIP 的该位置遇到一些“访问冲突”异常。
为什么我会收到此错误?这是因为某种 Windows 保护机制吗?还是 Windows 无法以这种字符串形式运行指令?你如何让程序执行这些指令?
assembly - 我需要特定的 Shellcode 顺序吗?将其转换为 shellcode 时我做错了什么?
我今天开始组装以创建 shell 代码。ASM 很好,过了一会儿我创建了这个:
效果很好:
所以我然后使用'objdump -d test'并得到了这个:
但是当我把它变成 shellcode 时:
它没有用。我做错了什么?
buffer-overflow - Shellcode不断突破Ability FTP Server缓冲区溢出漏洞
我正在从进攻安全.com 参加带有 Backtrack 的渗透测试课程,并且正在研究 Ability Server 的缓冲区溢出漏洞利用。我可以成功重写 EIP 并跳转到我的 shellcode。但是,当我开始在调试器中检查 shellcode 时,它会从 shellcode 中中断。我几乎 100% 确定我已经消除了坏字符。我什至在发送它之后将它发送到调试器中的 shellcode 之前比较了 shellcode,它们是相同的。
我很抱歉不得不通过 imgur 相册发布图片。由于我是 stackoverflow.com 的新手,因此在我获得一些街头信誉之前,他们不会允许我发布图片。
图片在缓冲区溢出相册中。(唯一专辑) http://edwardmcfellon.imgur.com/
{图 1}在这里,我在 EIP 设置了一个断点。到目前为止一切都很好。
{图 2}我让程序继续,它跳转到我的 shell 代码。一切都还好。
{图 3}当程序执行 POP EBX 时,我的 shellcode 中断,这是我的问题。
{图 4}这是它在破裂后结束的地方。
任何帮助,将不胜感激。仅供参考,我对编写缓冲区溢出非常陌生,我希望了解为什么会发生这种情况以及将来如何防止它。提前致谢。
c - 可靠的shellcode测试
如下代码应该能够“测试”shellcode,即执行它。
但是,当我尝试使用此类示例时,我发现代码似乎在不可执行的内存中执行,因为它在 shellcode 的第一条指令处接收到段错误。
如果我将 shellcode 声明改为 a #define
,我可以让 shellcode 执行。然而,当 shellcode 尝试写入自己的内存时,它会停止(这个 shellcode 假设它是在堆栈上执行的)。
所以我的问题很简单,测试假设可执行(显然)和可写内存的 shellcode 的最简单和可靠的方法是什么?如果我在堆栈或堆上分配代码并尝试跳转到它,我只会遇到 NX 位保护并再次失败。现在显然我可以禁用 NX 位,但是没有更好的方法来做这个测试吗?