首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >外壳代码执行/bin/sh,但不执行。/abcde

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

Stack Overflow用户
提问于 2014-02-25 22:07:13
回答 2查看 1.5K关注 0票数 0

我试图在一台服务器上运行一些shell代码,在该服务器上我无法访问shell,但我可以访问我自己的可执行bash脚本。

我的shellcode代码如下所示:

代码语言:javascript
复制
 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时,它不会运行我的可执行文件。

代码语言:javascript
复制
 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计算机。

编辑:为了更清楚,这是一个场景:

代码语言:javascript
复制
 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();
 }
EN

回答 2

Stack Overflow用户

发布于 2014-02-26 00:53:57

您的程序可移植性不是很好,因为您的字符串中包含ia32指令。在gdb的帮助下,它更容易阅读:

代码语言:javascript
复制
  (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

票数 0
EN

Stack Overflow用户

发布于 2016-03-09 10:48:46

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22016590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档