我找到了我不理解的教程中介绍的以下组装线:

 xor eax, eax      => clear, I know that, it makes eax = 0
 push eax          => push 0 on the stack
 push 0x68732f2f   => push "//sh" to the stack (the numbers are opcodes I guess, output of hexdump)
 push 0x6e69622f   => push "/bin" to the stack (again opcodes, representing "/bin" )
 mov ebx, esp      => put address of "/bin//sh
         |                        |
         |------------------------|<-----ESP (I know that ESP always points to the top)
(a)      |  0x6e69622f  ("//sh")  |
         |------------------------|
(b)      |   0x68732f2f ("/bin")  |
         |------------------------|
(c)      |       0                |
         |------------------------|
" into ebx, via esp ....


我的问题:
为什么我们把地址“ / bin / / sh“,通过esp,使用mov ebx行,将其输入ebx,尤其是esp?尝试向自己解释一下(我不确定它是否正确,但是我想过要考虑一下,然后再在该论坛上问):

ESP是一个32位寄存器,例如它足够大以包含(a),(b)和(c)(我在上面标记)中的地址。

对吗?希望有人能帮助我吗?

最好的问候,

#1 楼

首先,让我澄清一下:

ESP是32位寄存器,其中包含指向堆栈的指针。它只是指向一个存放comprise the addresses at [...]ab的内存位置。看一下c的十六进制表示形式:

2f 62 69 6e 2f 2f 73 68


现在看一下您的程序集:不是任何类型的操作码,而是字符串的ASCII表示形式,将其作为双字推送(基本上是在较少的指令中推送字符串)。 >
push 0x68732f2f
push 0x6e69622f


基本上,它通过将ASCII代码组合在一起而用更少的指令来完成上述操作:/bin//sh代替了6e69622f2f6269分开。它还推入6e,它是C风格字符串的终止符,因此字符串在此处结束。 0(中断),这是Linux用来进行系统调用的方式。

由于/bin//sh的系统调用ID为11,因此将sys_execve移至int 0x80sys_execve的下部),然后放置第一个参数进入11,它是指向字符串的指针。由于al指向堆栈的顶部,并且堆栈的顶部包含我们之前推送的eax,因此漏洞利用程序集的含义是:去,被剥削! :)

评论


谢谢你的解释。了解它对我很有帮助。

–user3097712
15年2月15日在15:24

@ user3097712没问题,请务必问我是否没有正确解释任何部分。

–rev
15年2月15日在15:26

#2 楼

这只是一种将字符串嵌入漏洞利用中的技术,因为您可以以常规方式定义它们,因为您需要使用它们的地址来访问它们,但是在漏洞利用中,这些地址是动态的,而不是静态或常量。