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 [...]
,a
和b
的内存位置。看一下c
的十六进制表示形式:2f 62 69 6e 2f 2f 73 68
现在看一下您的程序集:不是任何类型的操作码,而是字符串的ASCII表示形式,将其作为双字推送(基本上是在较少的指令中推送字符串)。 >
push 0x68732f2f
push 0x6e69622f
基本上,它通过将ASCII代码组合在一起而用更少的指令来完成上述操作:
/bin//sh
代替了6e69622f
,2f
,62
,69
分开。它还推入6e
,它是C风格字符串的终止符,因此字符串在此处结束。 0
(中断),这是Linux用来进行系统调用的方式。由于
/bin//sh
的系统调用ID为11,因此将sys_execve
移至int 0x80
(sys_execve
的下部),然后放置第一个参数进入11
,它是指向字符串的指针。由于al
指向堆栈的顶部,并且堆栈的顶部包含我们之前推送的eax
,因此漏洞利用程序集的含义是:去,被剥削! :)
评论
谢谢你的解释。了解它对我很有帮助。
–user3097712
15年2月15日在15:24
@ user3097712没问题,请务必问我是否没有正确解释任何部分。
–rev
15年2月15日在15:26