首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解外壳代码示例

理解外壳代码示例
EN

Stack Overflow用户
提问于 2014-09-27 14:44:57
回答 1查看 949关注 0票数 5

在seen代码教程中,我看到了以下示例:

代码语言:javascript
复制
 main(){

    exit(0);

 }

这个想法是创建一个exit()-syscall。于是,他们产生了组装:

代码语言:javascript
复制
  Section .text

      global _start

 _start:
      mov ebx, 0
      mov eax, 1
      int 0x80

我明白这一点。0是我们存储在ebx中的exit()参数,1是退出syscall的数量,0x80我们将CPU更改为内核模式,然后执行syscall。

在此之后,他们让生产的操作码是:

代码语言:javascript
复制
    bb 00 00 00 00
    b8 01 00 00 00
    cd 80

然后,将其转换为C语言,如下所示:

代码语言:javascript
复制
 char example[] = "\xbb\x00\x00\x00\x00"
                  "\xb8\x01\x00\x00\x00"
                  "\xcd\x80"

  int main(){

  int *pointer; 
  pointer = (int *)&pointer+2;
  (*pointer) = (int)example;
  }

因此,我所理解的是,它们在char数组中使用操作码,但我不理解它们在main()-methode中做了什么。第一行没问题。但是他们想用第二和第三行来表达什么呢?

诚挚的问候,

EN

回答 1

Stack Overflow用户

发布于 2014-09-27 15:35:04

代码接受堆栈变量的地址,然后地址在它上面的两个指针大小。然后,这个位置上的任何内容都会被外壳代码的地址覆盖。

如果覆盖的位置是函数的返回地址,那么当函数退出时,外壳代码将被执行。实验和反汇编可以帮助计算从局部变量到返回地址的正确偏移量。

通常,实际的漏洞将涉及堆栈缓冲区溢出(即,一个函数不检查它在堆栈缓冲区中放置的内容的长度,允许它“溢出”到返回地址):缓冲区可能被填充外壳代码,“溢出”部分将包含缓冲区的地址;这样,当函数退出时,它将在缓冲区内执行外壳代码。

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

https://stackoverflow.com/questions/26075825

复制
相关文章

相似问题

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