gpt4 book ai didi

c - 设计 Shellcode 会给出错误的结果

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:54 26 4
gpt4 key购买 nike

我做了这个简单的汇编程序:

.text
.globl _start
_start:
mov %20, %rbx
mov %1, %rax
int $0x80

这显然是在 64 位操作系统 (Linux) 上运行。然后我将其编译如下:

as -o ExitShellcode.o ExitShellcode.s
ld -o ExitShellcode ExitShellcode.o

最后运行程序后,它以状态 20 退出

echo $?
20

使用 objdump 转储文件的 shellcode 给出:

objdump -d ExitShellcode

ExitShellcode: file format elf64-x86-64


Disassembly of section .text:

0000000000400078 <_start>:
400078: 48 c7 c3 14 00 00 00 mov $0x14,%rbx
40007f: 48 c7 c0 01 00 00 00 mov $0x1,%rax
400086: cd 80 int $0x80

但是,在将 shellcode 放入该程序后:

#include <stdio.h>

char shellcode[] = "\x48\xc7\xc3\x14\x00\x00\x00"
"\x48\xc7\xc0\x01\x00\x00\x00"
"\xcd\x80";

int main()
{
int *ret;

ret = (int *)&ret +2;

*ret = (int)shellcode;

}

和编译:

gcc -g -o Shellcode Shellcode.c
Shellcode.c: In function ‘main’:
Shellcode.c:13:9: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
*ret = (int)shellcode;

并运行,程序以 0 状态退出:

echo $?
0

问题是什么?它不应该以 20 退出吗?

最佳答案

您的代码错误地假设编译器会将变量 ret 放在栈上相对于 main 的返回地址的特定位置。相反,编译器将它放在其他地方,因为它被允许这样做,所以你的代码什么都不做。您可能正在关注您在 Internet 上找到的设计糟糕的示例。

如果你想执行 shellcode 数组中的“shellcode”,你可以尝试向它转换一个指向函数的指针,然后调用它:

char shellcode[] = "\x48\xc7\xc3\x14\x00\x00\x00"
"\x48\xc7\xc0\x01\x00\x00\x00"
"\xcd\x80";

int main()
{
((void (*)()) shellcode)();
}

然而,这仍然可能会失败,因为放置 shellcode.data 部分不可执行,因此程序在运行时会崩溃。要解决该问题,请在链接程序时使用 -zexecstack 选项。例如:

gcc -zexecstack -g -o Shellcode Shellcode.c

关于c - 设计 Shellcode 会给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37897781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com