任何人都可以解释这汇编代码

这是一个利用bufferoverflow漏洞的shellcode。 这设置setuid(0)并使用execve()生成一个shell。

  • xor%ebx,%ebx * /
  • lea 0x17(%ebx),%eax * /
  • int $ 0x80 * /
  • 推%ebx * /
  • 推$ 0x68732f6e * /
  • 推$ 0x69622f2f * /
  • mov%esp,%ebx * /
  • 推%eax * /
  • 推%ebx * /
  • mov%esp,%ecx * /
  • cltd * /
  • mov $ 0xb,%al * /
  • int $ 0x80
  • 这是我解释它的方式......

  • Xoring使ebx值为0
  • 将23添加到0并将有效地址加载到eax。 对于setuid()
  • 3.interrupt

    4.推出ebx

    5.推地址//只有这个地址?

    6.推出地址/ /相同的问题

    12 mov execve sys调用到al

    13中断

    任何人都可以清楚地解释整个步骤?


    int是触发软件中断的操作码。 软件中断编号(从0到255)并由内核处理。 在Linux系统上,中断128(0x80)是系统调用的传统入口点。 内核期望系统调用寄存器中的参数; 特别是%eax寄存器可以识别我们正在讨论的系统调用。

  • 将%ebx设置为0
  • 计算%EBX + 23,并将结果存储在%eax中(操作码是lea为“加载有效地址”,而不是存储器访问参与;这是一种制备加成的只是一个迂回的方式)。
  • 系统调用。 %eax包含23,这意味着系统调用是setuid 。 该系统调用使用一个参数(目标UID)在%ebx中找到,该值在该点(它在第一条指令中设置)方便地包含0。 注意:返回时,寄存器是未修改的,除了包含系统调用返回值的%eax,通常为0(如果调用成功)。
  • 在堆栈(仍然为0)上按%ebx。
  • 在堆栈上推$ 0x68732f6e。
  • 在堆栈上推$ 0x69622f2f。 由于堆栈增长为“向下”,并且由于x86处理器使用小端编码,因此指令4至6的效果是%esp(堆栈指针)现在指向一个12字节的序列,其值为2f 2f 62 69 6e 2f 73 68 00 00 00 00(十六进制)。 这是“// bin / sh”字符串的编码(终止零,之后有三个额外的零)。
  • 将%esp移至%ebx。 现在%ebx包含一个指向上面构建的“// bin / sh”字符串的指针。
  • 在堆栈中推入%eax(在此时%eax为0,它是setuid的返回状态)。
  • 在堆栈上推送%ebx(指向“// bin / sh”的指针)。 指令8和9在堆栈上构建了一个由两个指针组成的数组,第一个指针指向“// bin / sh”,第二个指针指向NULL指针。 该数组是execve系统调用将用作第二个参数的数组。
  • 将%esp移至%ecx。 现在%ecx指向使用指令8和9构建的数组。
  • 将%eax签名扩展为%edx:%eax。 cltd是英特尔文档调用cdq的AT&T语法。 由于%eax在该点为零,因此将%edx设置为零。
  • 将%al(%eax的最低有效字节)设置为11.由于%eax为零,因此%eax的整个值现在为11。
  • 系统调用。 %eax(11)的值将系统调用标识为execveexecve需要三个参数,%ebx(指向要执行的文件的字符串的指针),%ecx(指向字符串指针数组的指针,它是程序参数,第一个是程序名称的副本,被调用的程序本身使用)和%edx(指向指向字符串的指针数组的指针,它们是环境变量; Linux在空闲环境中容忍该值为NULL)。
  • 因此,代码首先调用setuid(0) ,然后调用execve("//bin/sh", x, 0) ,其中x指向一个包含两个指针的数组,第一个指向“// bin / sh”的指针,而另一个是NULL。

    这段代码相当复杂,因为它想要避免零:当组装成二进制操作码时,指令序列只使用非零字节。 例如,如果第12条指令是movl $0xb,%eax (将整个movl $0xb,%eax设置为11),则该操作码的二进制表示将包含值为0的三个字节。缺少零使得该序列可用作为以零结尾的C字符串的内容。 当然,这是为了通过缓冲区溢出来攻击错误的程序。

    链接地址: http://www.djcxy.com/p/72447.html

    上一篇: Can anyone explain this assembly code

    下一篇: Process command line in Linux 64 bit