任何人都可以解释这汇编代码
这是一个利用bufferoverflow漏洞的shellcode。 这设置setuid(0)并使用execve()生成一个shell。
这是我解释它的方式......
3.interrupt
4.推出ebx
5.推地址//只有这个地址?
6.推出地址/ /相同的问题
12 mov execve sys调用到al
13中断
任何人都可以清楚地解释整个步骤?
int
是触发软件中断的操作码。 软件中断编号(从0到255)并由内核处理。 在Linux系统上,中断128(0x80)是系统调用的传统入口点。 内核期望系统调用寄存器中的参数; 特别是%eax寄存器可以识别我们正在讨论的系统调用。
lea
为“加载有效地址”,而不是存储器访问参与;这是一种制备加成的只是一个迂回的方式)。 setuid
。 该系统调用使用一个参数(目标UID)在%ebx中找到,该值在该点(它在第一条指令中设置)方便地包含0。 注意:返回时,寄存器是未修改的,除了包含系统调用返回值的%eax,通常为0(如果调用成功)。 setuid
的返回状态)。 execve
系统调用将用作第二个参数的数组。 cltd
是英特尔文档调用cdq
的AT&T语法。 由于%eax在该点为零,因此将%edx设置为零。 execve
。 execve
需要三个参数,%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字符串的内容。 当然,这是为了通过缓冲区溢出来攻击错误的程序。