【问题标题】:Understanding of a shellcode example一个shellcode例子的理解
【发布时间】:2014-09-27 14:44:57
【问题描述】:

在一个shellcode教程中,我看到了下面的例子:

 main(){

    exit(0);

 }

这个想法是创建一个 exit()-系统调用。 所以,然后他们生成程序集:

  Section .text

      global _start

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

我明白这一点。 0 是我们存储在 ebx 中的 exit() 的参数,1 是退出系统调用的编号,使用 0x80 我们将 CPU 更改为内核模式并执行系统调用。

之后,他们让我们生成以下操作码:

    bb 00 00 00 00
    b8 01 00 00 00
    cd 80

然后,他们将其翻译成 C 语言,如下所示:

 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() 方法中做了什么。 第一行没问题。但是他们想用第 2 行和第 3 行来表达什么?

最好的问候,

【问题讨论】:

    标签: c pointers assembly shellcode opcodes


    【解决方案1】:

    代码获取堆栈变量的地址,然后是其上方两个指针大小的地址。 然后,该位置的任何内容都会被 shellcode 的地址覆盖。

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


    通常,实际的利用将涉及堆栈缓冲区溢出(即,一个不检查其放入堆栈缓冲区的长度的函数,允许它“溢出”到返回地址):缓冲区可能用 shellcode 填充,“溢出”部分将包含缓冲区的地址;这样,当函数退出时,它将在缓冲区中执行shellcode。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2011-06-17
      • 2012-03-11
      • 1970-01-01
      相关资源
      最近更新 更多