声明:主要内容来自《The Shellcoder's Handbook》,摘录重点作为笔记并加上个人的一些理解,如有错,请务必指出。

系统调用

Shellcode是一组可注入的指令,可在被攻击的程序内运行。由于shellcode要直接操作寄存器,通常用汇编语言编写并翻译成十六进制操作码。我们想让目标程序以不同与设计折预期的方式运行,操纵程序的方法之一是强制它产生系统调用。

在Linux里有两种方法来执行系统调用。间接的方法是libc,直接的方法是用汇编指令调用软中断执行系统调用。在Linux里,程序通过int 0x80软中断来执行系统调用,调用过程如下:

1、把系统调用编号载入EAX;

2、把系统调用的参数压入其他寄存器;最多支持6个参数,分别保存在EBX、ECX、EDX、ESI、EDI和EBP里;

3、执行int 0x80指令;

4、CPU切换到内核模式;

5、执行系统函数。

如何得到一个shellcode

注意两点:
1、shellcode应该尽量紧凑,这样才能注入更小的缓冲区;

2、shellcode应该是可注入的;当攻击时,最有可能用来保存shellcode的内存区域是为了保存用户的输入而开辟的字符数组缓冲区。因此shellcode不应包含空值(/x00),在字符数组里,空值是用来终止字符串的,空值的存在使得把shellcode复制到缓冲区时会出现异常。

下面以exit()系统调用为例写一个shellcode。exit()的系统编号为1。用汇编指令实现:

Section .textglobal _start
_start:mov ebx,0mov eax,1int 0x80

用nasm编译生成目标文件,然后用GNU链接器链接目标文件,最后用objdump显示相应的操作码(下图的标号为_start部分):

sep@debian66:~/shellcode$ nasm -f elf shellcode.asm
sep@debian66:~/shellcode$ ld -o shellcode shellcode.o
sep@debian66:~/shellcode$ objdump -d shellcodeshellcode: file format elf32-i386Disassembly of section .text:08048080 <_start>:8048080: bb 00 00 00 00 mov $0x0,%ebx8048085: b8 01 00 00 00 mov $0x1,%eax804808a: cd 80          int $0x80
sep@debian66:~/shellcode$

shellcode[] = {"/xbb/x00/x00/x00/x00/xb8/x01/x00/x00/x00/xcd/x80"},可以发现里面出现很多空值,基于shellcode的可注入性,我们需要找出把空值转换成非空操作码的方法。有两种方法:

1、直接用其他具有相同功能的指令替换那些产生空值的指令;

2、在运行时用指令加上空值。

第2个方法比较复杂,暂时先讨论第1个方法。根据objdump的结果,发现mov ebx,0和mov eax,1均产生空值。了解汇编语言的话,可修改为以下代码:

Section .textglobal _start
_start:xor ebx,ebxmov al,1int 0x80

编译、链接、反汇编.text段:

sep@debian66:~/shellcode$ nasm -f elf shellcode.asm
sep@debian66:~/shellcode$ ld -o shellcode shellcode.o
sep@debian66:~/shellcode$ objdump -d shellcodeshellcode: file format elf32-i386Disassembly of section .text:08048080 <_start>:8048080: 31 db xor %ebx,%ebx8048082: b0 01 mov $0x1,%al8048084: cd 80 int $0x80
sep@debian66:~/shellcode$

可以看到shellcode的空值消失了,长度也减少了。该shellcode是可注入的。

派生shell

如何写一个派生shell的shellcode,参考原书P39,这里不详述。我现在只需对shellcode的获取有个大致的了解,实现时再看细节。

shellcode之三:shellcode编写相关推荐

  1. ShellCode原理以及编写

    0x0 ShellCode编写注意事原理 1)不能使用字符串的直接偏移 即使你在C/C++代码中定义一个全局变量,一个取值为"Hello world"的字符串, 或直接把该字符串作 ...

  2. php shellcode,Windows Shellcode学习笔记

    0x00 前言 Windows Shellcode学习笔记--通过VisualStudio生成shellcode,shellcode是一段机器码,常用作漏洞利用中的载荷(也就是payload). 在渗 ...

  3. k8s自定义controller三部曲之三:编写controller代码

    本文是<k8s自定义controller三部曲>的终篇,前面的章节中,我们创建了CRD,再通过自动生成代码的工具将controller所需的informer.client等依赖全部准备好, ...

  4. linux 生成shellcode,基本shellcode提取方法

    下面,我们用C语言内嵌汇编的方式,构造shellcode,具体代码如下.有一点要注意,Linux X86默认的字节序是little-endian,所以压栈的字符串要注意顺序.(如"/bin/ ...

  5. linux 64位 shellcode,Linux Shellcode“你好,世界!”

    小编典典 注入此shellcode时,您不知道位置message: mov ecx, message 在注入的过程中,它可以是任何东西,但不会如此,"Hello world!\r\n&quo ...

  6. 【iOS与EV3混合机器人编程系列之三】编写EV3 Port Viewer 应用监测EV3端口数据

    在前两篇文章中,我们对iOS与EV3混合机器人编程做了一个基本的设想,并且介绍了要完成项目所需的软硬件准备和知识准备. 那么在今天这一篇文章中,我们将直接真正开始项目实践. ==第一个项目: EV3 ...

  7. django之三--如何编写一个html页面并展示到浏览器

    一.前言 在django中,视图的概念是:具有相同功能和模板的网页,都可以称为视图.通俗一点来说,就是你平常打开任一浏览器,输入一个地址A后看到浏览器窗口展示出来地址A所对应的页面内容B,页面内容B就 ...

  8. windows 平台shellcode编写

    0x00.介绍 比方说你手头上有一个IE或FlashPlayer现成的漏洞利用代码,但它只能够打开计算器calc.exe.但是这实际上并没有什么卵用,不是吗?你真正想要的是可以执行一些远程命令或实现其 ...

  9. 溢出的原理及 shellcode 编写

    本讲的预备知识: 首先你应该了解intel汇编语言,熟悉寄存器的组成和功能.你必须有堆栈和存储分配方面 的基础知识,有关这方面的计算机书籍很多,我将只是简单阐述原理,着重在应用.其次, 你应该了解li ...

最新文章

  1. cas+shiro+spring 单点登录
  2. 打开git命令窗口_用动图的形式打开 10 大 Git 命令?
  3. OVS datapath简介(十八)
  4. 【CTF解题】BCTF2018-houseofatum-Writeup题解
  5. mysql5.7.25源码安装_源码编译安装 mysql5.7.25
  6. 共克时艰:科技助力湖北地区银行业务线上转型
  7. 【转】C# split 几种使用方法
  8. 微软发布的两个MSF过程指导(Process Guidance)
  9. 光刻机的“崛起秘密”,第一本ASML的企业成长传记来了!
  10. DHTML【9】--Javascript
  11. Ubuntu使用总结二
  12. 大学生如何自学PR剪辑以及PS教程?
  13. 计算机进制之间的转换(2进制、10进制、8进制、16进制)
  14. 计算机任务管理器无法响应,电脑任务管理器经常未响应怎么办
  15. mysql生成连续数字或日期
  16. 中国鸡荣华鸡为什么干不过洋鸡肯德基
  17. HDU6411 带劲的and和
  18. mysql数据库特别大怎么备份_如何备份还原mysql数据库 mysql数据库太大备份与还原方法...
  19. java斗地主发牌_程序员:Java斗地主部分功能实现:创建牌、发牌并按牌id对其排序...
  20. 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告

热门文章

  1. symbol DS3578条码扫描器设置回车
  2. 2016前端实习总结
  3. 二阶巴特沃斯滤波器代码
  4. php fpm高并发,php服务器高并发优化思路
  5. hdu 2648 shoping
  6. WorkNC应用技巧分享—尖角清根时获得完美刀路
  7. java 当前utc时间_Java获取UTC时间的方法详解
  8. 思考方式的Change 鬼脚图
  9. ksweb安卓手机服务器教程-Termux-,端口映射,内网穿透
  10. FFmpeg简介(一)