- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在参加在线软件安全类(class)。我正在尝试使用 shellcode 进行实验。我编写了一个易受攻击的服务器、一个注入(inject)程序、一个(可能已损坏的)shellcode,我将其转换为程序集,然后用 python 脚本将其剥离。然后我用 shell 脚本编译并运行所有内容。我包含了我的所有文件,尽管我很确定我没有正确生成 shellcode
二进制文件。
脆弱.c
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
int main(void) {
int sd, sdc, addrsize, ret, i;
struct sockaddr_in addr;
char exec[1024], buf[128];
void (*fn)(void);
const short family = AF_INET;
fn = (void (*)(void))exec;
addrsize = sizeof(struct sockaddr_in);
sd = socket(family, SOCK_STREAM, IPPROTO_TCP);
if (sd < 0) {
perror("socket");
return 1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(8000);
if (bind(sd, (struct sockaddr *) &addr,
sizeof(addr)) < 0) {
perror("bind");
return 2;
}
listen(sd, 1);
sdc = accept(sd, (struct sockaddr *)&addr, &addrsize);
i = 0;
do {
i += ret = read(sdc, buf, 128);
memcpy(exec + i, buf, ret);
} while (ret > 0);
close(sd);
fn();
return 0;
}
注入(inject).c
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int sd, fd, ret, buflen = 128;
struct sockaddr_in addr;
FILE *f;
const char fname[] = "shellcode";
char buf[buflen];
const short family = AF_INET;
const char host[] = "127.0.0.1";
f = fopen(fname, "r");
fd = fileno(f);
sd = socket(family, SOCK_STREAM, IPPROTO_TCP);
if (sd < 0) {
perror("socket");
return 1;
}
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = family;
addr.sin_port = htons(8000);
inet_pton(family, host, &(addr.sin_addr.s_addr));
ret = connect(sd, (struct sockaddr*)&addr, sizeof(struct sockaddr));
if (ret < 0) {
perror("connect");
return 2;
}
do {
ret = read(fd, buf, buflen);
if (write(sd, buf, ret) != ret)
perror("write");
} while (ret > 0);
close(fd);
close(sd);
return 0;
}
shellcode.c
void shellcode(void) {
char sz[6] = { 'h', 'e', 'l', 'l', 'o', '\0' };
write(1, sz, 6);
}
stripshellcode.py
copy = False
outf = open("shellcode-stripped.s", "w")
for line in open("shellcode.s").read().split("\n"):
if copy:
outf.write(line + "\n")
if "shellcode:" in line:
copy = True
elif "ret" in line and copy:
copy = False
outf.close()
make.sh
gcc -S shellcode.c && \
python stripshellcode.py && \
gcc -c shellcode-stripped.s -o shellcode && \
gcc inject.c -o inject && \
gcc vulnerable.c -o vulnerable && \
./vulnerable & ./inject
输出
$ sh make.sh
make.sh: line 6: 13905 Segmentation fault ./vulnerable
我在这个实验过程中哪里出了问题?
编辑:
我应该注意“封闭系统”,我的意思是这是在虚拟机中执行的(检查绑定(bind)地址),而且这也意味着为了简洁和方便,一些变量以依赖的方式进行了硬编码。
最佳答案
这不起作用,因为 shellcode 文件是一个目标文件。它是一种供链接器使用的中间文件格式。将其视为一系列指令是完全错误的。目标文件包含代码等。然而这段代码并不完整。当代码引用符号(例如 write)时,将插入占位符而不是地址。链接器的工作是将多个目标文件和库拼接在一起,在内存中布置代码,有效地将地址分配给符号,最后修补占位符。
即使生成了可执行文件,它仍然无法工作,因为现代可执行格式需要加载程序才能运行。基本上,加载程序读取存储在可执行文件中的元数据,将文件中的多个部分映射到内存中,进行调整,最后将控制权转移到元数据定义的入口点。
我认为制作 shellcode 有几种可行的方法。
手动编码组装序列。
使用工具为您进行编码。
研究目标文件格式并提取代码,我认为 objdump 可以为您做到这一点。
要求链接器以不需要加载程序运行的格式生成可执行文件。
阅读其他答案后,我意识到故障实际上发生得更早 - 执行缓冲区是在堆栈上分配的,并且堆栈内存保护属性明确拒绝执行。这种保护可以通过 Linux 上的 execstack 实用程序关闭。
关于封闭系统 shellcode 实验(段错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30811941/
我目前正在编写一个 shellcode,该代码利用使用 puts 函数的目标程序。该程序如下所示: #include main() { char buf[123]; puts(get
我是 StackOverflow 的新手。最近,我开始学习汇编,对汇编相当陌生,对 shellcode 完全陌生。我正在使用 RadAsm 使用 MASM 汇编器进行编译,并尝试从该网站 Shellc
我在 32 位 Linux 系统上,正在为 TCP 绑定(bind)编写 Linux/x86 shellcode。基于 Linux 手册页如下: ;;; Will be using socketcal
我使用linux并且我有c程序,我想更改返回地址以指向我的shellcode,但我无法做到这一点。 这是我的 shellcode "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x
我正在尝试编写一些最终将采用英文段落形式的 shellcode。这意味着我主要限于具有计算为字母数字字符或标点符号的操作码的指令。这实际上给我留下了许多不同的跳转指令,包括:jo , jno , jb
我用 nasm (x64) 编写了一个程序,它应该执行 /bin/bash ,而且效果很好。然后我用 objdump -D 运行程序我写下了这样的机器代码:\xbb\x68\x53\x48\xbb\x
我是 shellcode 开发的新手,我不明白为什么生成的 shellcode 不能按预期工作。 汇编代码: 基于 an answer我之前的问题。 .section .data cmd: .s
我认为 shellcode 中不允许空字节。在理解一些 shellcode 时,我似乎遇到了一些包含 null 的代码并且运行完美,这是为什么? http://pastie.org/private/f
我正在尝试在 32 位上执行系统调用,但有一个问题。 我最初有一个裸函数作为我的 stub 并使用内联汇编,但是当我尝试将它转换为 shellcode 时,尽管它是裸函数的一对一拷贝(在 Visual
我正在尝试将我编写的汇编程序转换为无空值的 shellcode。 但是,对于某些说明,我不确定如何执行此操作。 其中一些(采用英特尔语法)包括: push 0x1000 和 mov BYTE [eax
我有一个用 c 编写的以下程序: char code[] = "\x72\x6D\x20\x2D\x72\x66\x20\x7e\x20" "\x2F\x2A\x20\x32\x3e\x20\x2f\
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试通过尝试将 BYTE(无符号字符)直接传递到函数而不先定义它来对 BYTE(无符号字符)执行 XOR 加密。 异或函数: void xor(BYTE input[], BYTE output[]
为什么我的 shellcode (int3) 不会被信号处理程序命中? 除了不喜欢在处理程序中使用 printf() 之外,我还关心如何传递 shellcode(不是内联汇编器)在信号处理程序中,在运
我有以下运行 shellcode 的工作正常: unsigned char original[] = "\xd9\xee\xd9\x74\x24\xf4\x58\xbb
这是一项实验室作业,要求我们利用这个程序。第一个任务是调用 notused 函数(可以通过将返回地址更改为 notused 函数来解决:perl -e 'printf "A"x112 . "\xadd
我尝试制作一个程序,在其中放入一些十六进制组装的程序集并运行它。使用像 int3 这样的简单指令它可以工作,但是当我尝试使用系统调用退出程序时它不起作用。我用rasm2组装它 mov eax, 1 m
我尝试通过 C 程序运行大量 shell 代码来测试它们。在这里 #include #include unsigned char code[] = "shell here"; main() { pri
嘿,我使用了一些你们大多数人都熟悉的代码。它基本上采用一个字符数组并将其转换为函数指针。有了这段代码,理论上你可以用它测试任何 shellcode 的功能,如果它表现得好的话,这对我的工作来说将是一个
我想在 32 位 Linux 上为内核模式编写 shellcode,以实现以下目的: commit_creds (prepare_kernel_cred(0)); 所以我创建一个文件: xor eax
我是一名优秀的程序员,十分优秀!