+ +

shell懵逼中

emmmmm,继前天的,今天讲了如何构造shellcode,以及利用shellcode得到shell。

如何构建shellcode

Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。system(“shell”)相当于execve(“/bin/sh”,0,0),我们得到的shellcode即为execve(“/bin/sh”,0,0)的机器码。

  • 1、为什么execve(“/bin/sh”,0,0)可以调用shell函数?(系统调用)

    在汇编代码后面加上int 0x80,可以实现系统调用,其中EAX寄存器中存被调用的编号,EBX存可执行文件,ECX和EDX存参数,表示一些环境变量。所以我们要调用shell,要实现的有以下步骤:EAX赋值为11,EBX赋为“/bin/sh”,ECX和EDX赋值为0,最后int 0x80。
    Section .text
       global _start
    _start:
       xor ecx, ecx
       mul ecx
       push ecx
       push 0x68732f2f
       push 0x6e69622f
       mov ebx, esp
       mov al, 0xb
        int 0x80

    但我们要注意:在这过程中容易出现坏字符,0x00表示截断,有其他的含义,解决办法为:比如mov eax,5,其实是mov eax,0x00000005,这时候用mov al,5;mov al 5的意思是mov eax,0x05,就不会出现0x00了。当然也可以通过绕过的方法:@#¥%
  • 如何将其变为机器码

    ①编译,将我们的汇编文件变成可执行文件,在Linux系统中,可执行文件后缀名被默认为.ELF,注意,在Linux系统中,所以东西都是文件或文件夹,而且没有分类,我们默认在其后面加入固定的字母以分类。代码:nasm -f elf64 shellcode.asm -o shellcode.o,其中-f表示文件形式输出,elf64表示64位系统,-o表示输出文件,shellcode.asm汇编代码写的文件,shellcode.o汇编代码执行后生成的可执行文件。

    ②通过objdump -d shellcode.o可以获得我们需要的机器码,shellcode=”\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80”(21字节)

有关系统文件的一些特性

在Linux系统下有Nx(No execute),即不能执行,Windows下有Data Execution Prevention,即数据执行禁止,总的一句话,可执行的不可写,可写的不可执行,为了保证系统安全。

一些保护


1、ASLR

会随机改变栈、堆、共享库映射等线性区布局的随机化,即相差多少不会变,但是总体位置会进行偏移,关闭:sudo sh -c “echo 0 > /proc/sys/kernel/randomize_va_space”,打开的话,把0改为2即可。

2、栈保护天使

关闭方法:在界面输入gcc -g hello.c -o hello -z execstack -fno-stack-protector,自行匹配

例题


源码:



第一种方法:

大概意思:程序有gets函数,通过这个输入shellcode,再找到shellcode的地址,将该地址覆盖到原来填充返回地址的位置,即获得了shell。

具体实现步骤:首先建立一个python脚本,payload那里先写入一个标记字符,然后通过该字符找到其写入位置,再在该位置输入shellcode,然后偏移量算出来后,在return address的位置写入我们找到的位置。

建立python脚本,其中p32的意思是emmm,注意脚本中raw_input()的作用为让程序暂时停下以便于我们查找地址。



运行python脚本,会产生一个pid,这时另开一个输入gdb attach pid,即可将gdb与python脚本连接起来。便可开始查找地址。



因为python脚本中的raw_input,我们需要在python运行的那个界面按下回车才能继续运行





因为此时在程序的比较内部的结构,我们可通过不断finish,直到看到A函数,这时我们输入searchmem 0xdeadbeef,便可找到其地址0xffffced8




接下来找偏移量,与前天一样:





修改脚本,再次连接





将ASLR打开,这时候我们先找一个确定的位置再输入shellcode显然行不通,我们就需要利用文件本身的一些特性。

具体步骤:

开启aslr



gdb 进入文件,start,然后输入vmmap,分析内存,发现第三行比较特别,它属于主程序,所以aslr保护并不能改变它的地址,而且他权限为可读可写可执行,称为bss,我们可以利用这一特性,来写入shellcode并执行。



脚本文件如下,return address 的位置填上了gets函数的地址,相当于调用gets函数,后面两个,一个为参数,一个为返回地址,都填上bss的地址,我们第二次输入的时候便是在那个特殊的位置写入并执行。