首页
社区
课程
招聘
Asis CTF 2016 b00ks
发表于: 2018-4-1 15:50 24083

Asis CTF 2016 b00ks

2018-4-1 15:50
24083

  本篇文章是对CTF WIKI Off-By-One漏洞类型的补充. CTF WIKI上面Off-By-One这一章节中两个例子均没有给出相应的EXP, 本次总结将其中一个例子详细分析一下, 希望能够对其他学习者有帮助

该程序是一个图书管理系统,可以添加书名,修改作者名以及写备注等功能.

1. Welcome

输入一个name

2. Create a book

3. Delete

4. Edit a book

5. Print book detail

6. Change current author name

7. Exit

1.b00k结构体

    程序运行, 创建一个结构体数组,设为b00ks.

2.b00ks位置

3.Null byte overflow

    修改author, 输入32个字符,会出现空子节覆盖first b00k指针最后一个字节

    Off-By-One 顾名思义就是我们能够多写入一个字节的内容.

  举一个简单的例子:建造一条直栅栏(即不围圈),长30米、每条栅栏柱间相隔3米,需要多少条栅栏柱?

  最容易想到的答案是10, 但正确答案是911. 这种错误是C语言初学者常犯的错误, 经常在数组或循环出现.

    漏洞点: 问题出在对author的处理上, 当我们输入32个字符时, 程序会将第33个字符赋值为"\x00", 从而出现了Null Byte Overflow.
result

    思路分析: 创建两个b00k, 在first b00k中伪造b00k进而控制second b00kdescription指针, 将该指针改为__free_hook, 修改second b00kdescriptionexecve("/bin/sh"), 最后free

1. 创建第一个first b00k

    结论:0x55f276c74160 --> 0x55f276c74100时, 0x55f276c74100正好落在first b00kdescription中, 属于可控范围, 为我们伪造b00k打下了基础.

2. 伪造b00k

    结论: 可以看到0x55f276c74100已经是fake b00k

3. 空字节覆盖

    泄露的是second b00kname pointerdescription pointer.
这个指针和libc base address是有直接联系的.

  offset = 0x7f282b8e7010 - 0x00007f282b33e000 = 0x5a9010
  结论: 通过伪造的b00k, 我们泄露了 libc base address.

4.获取相关指针

主要是两个

    结论: 通过libc base address, 退出了__free_hookexecve_addr在程序中的实际位置.

5.修改

    通过first b00k修改second b00kdescription指针为__free_hook, 在修改second b00k的description内容为execve("/bin/sh", null, environ), 最后执行free

    结论: 由于__free_hook里面的内容不为NULL, 遂执行内容指向的指令, 即execve("/bin/sh", null, environ)

为什么第二个 b00k申请的空间那么大?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-4-20 19:25 被baolongshou编辑 ,原因: 贴中有稍许错误
收藏
免费 1
支持
分享
最新回复 (14)
雪    币: 4
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
请问这道题的的二进制文件可以在哪里下载呢?网上找半天没找到
2018-4-15 23:57
0
雪    币: 5564
活跃值: (4598)
能力值: ( LV13,RANK:300 )
在线值:
发帖
回帖
粉丝
3
80bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6n7b7W2y4Q4x3X3c8n7K9h3I4D9i4K6u0V1c8$3q4@1k6i4y4Q4x3V1k6o6g2p5k6Q4x3V1k6@1M7X3g2W2i4K6u0r3y4r3b7H3y4K6y4T1y4X3b7K6y4X3f1J5j5e0l9I4k6U0u0U0y4o6m8U0x3K6N6U0k6U0j5^5k6o6l9I4x3e0p5@1y4o6m8U0k6o6N6S2j5#2)9J5c8X3y4@1k6W2)9J5k6s2N6A6K9$3W2Q4x3V1k6Z5k6h3q4H3i4K6u0r3L8$3k6X3i4K6g2X3j5Y4W2Q4y4h3k6G2L8X3f1`.
2018-4-16 13:20
0
雪    币: 5564
活跃值: (4598)
能力值: ( LV13,RANK:300 )
在线值:
发帖
回帖
粉丝
4
二进制文件请看这里:e6eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6n7b7W2y4Q4x3X3c8n7K9h3I4D9i4K6u0V1c8$3q4@1k6i4y4Q4x3V1k6o6g2p5k6Q4x3V1k6@1M7X3g2W2i4K6u0r3y4r3b7H3y4K6y4T1y4X3b7K6y4X3f1J5j5e0l9I4k6U0u0U0y4o6m8U0x3K6N6U0k6U0j5^5k6o6l9I4x3e0p5@1y4o6m8U0k6o6N6S2j5#2)9J5c8X3y4@1k6W2)9J5k6s2N6A6K9$3W2Q4x3V1k6Z5k6h3q4H3i4K6u0r3L8$3k6X3i4K6g2X3j5Y4W2Q4y4h3k6G2L8X3f1`.
2018-4-16 13:20
0
雪    币: 5
活跃值: (67)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
版主我用你的payload调用execve函数不能成功getshell
当我把part three改成 

#part three

edit(1,p64(binsh_addr)+p64(malloc_hook))

edit(2,p64(system_addr))

delete(2)


调用system函数时才能成功getshell,不知道是否与execve需要3个参数,而这里无法给足3个参数的原因,如果楼主能用execve函数成功getshell,希望可以指导一下

最后于 2018-4-20 02:34 被hacker丶mao编辑 ,原因:
2018-4-20 01:58
0
雪    币: 5564
活跃值: (4598)
能力值: ( LV13,RANK:300 )
在线值:
发帖
回帖
粉丝
6
hacker丶mao 版主我用你的payload调用execve函数不能成功getshell当我把part three改成 #part threeedit(1,p64(binsh_addr)+p64(ma ...
5楼同学,  我又重新作了一遍题,  发现一个偏移地址错了.
  0x5a9010  修改为0x5cd010,  你可以再试一下,  我这边是getshell,  了.
多谢斧正
2018-4-20 19:27
0
雪    币: 5
活跃值: (67)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
问题解决了,原来libc里面有个函数实现了execve("/bin/sh",  null,  environ),我刚开始找的就只是单纯调用execve函数的地址并没有任何参数,感谢楼主,获益匪浅
2018-4-22 00:02
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
pwn萌新没看懂part  three,请问part  three的第一段payload为什么要p64(free_hook)  *  2?在delete  book的时候是把name、descript、以及book_ptr都free了,为什么修改了book1和book2的descript的内容可以在free的时候把shell执行起来?
2018-5-15 22:24
0
雪    币: 11
活跃值: (12)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
supermole pwn萌新没看懂part three,请问part three的第一段payload为什么要p64(free_hook) * 2?在delete book的时候是把name、descript、以及bo ...
第一段payload=p64(free_hook)*2,是因为在构造fake  book_struct时book1的desc_ptr是指向book2_name_ptr的。后面在free时能够将shell执行起来,主要思想是通过edit  book_desc,将__free_hook处的内容修改为execve("/bin/sh",  NULL,  NULL)。
2018-6-4 23:39
0
雪    币: 61
活跃值: (2520)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
10
hacker丶mao 问题解决了,原来libc里面有个函数实现了execve("/bin/sh", null, environ),我刚开始找的就只是单纯调用execve函数的地址并没有任何参数,感谢楼主 ...
你好,execve("/bin/sh",  null,  environ)这个函数在libc的偏移怎么找?我只能找到execve()的偏移。
2018-8-29 18:34
0
雪    币: 2
活跃值: (215)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
iddm 你好,execve("/bin/sh", null, environ)这个函数在libc的偏移怎么找?我只能找到execve()的偏移。
aaaK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6V1j5i4k6A6k6o6V1@1x3X3A6Q4x3V1k6G2L8X3g2Q4y4h3k6Y4j5h3c8Y4k6i4b7`.
2018-8-30 08:55
0
雪    币: 31
活跃值: (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请问不知道对方libc版本,怎么知道book2的name地址和libc基址的偏移是多少呢,本地可以调试查看,但远程的没法调试啊,多谢楼主
2018-12-28 09:18
0
雪    币: 199
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
请问原题目中有给出libc.so吗?
如果没有给出libc的情况下,如何利用呢?
2019-1-22 20:42
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
请问刚开始就是Null byte overflow的时候,覆盖后point的最低地址的数据为\x00,printf不是有00截断吗,为啥会输出
2020-2-8 02:17
0
雪    币: 53
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
git_38724summerN 请问刚开始就是Null byte overflow的时候,覆盖后point的最低地址的数据为\x00,printf不是有00截断吗,为啥会输出[em_5]
是先写入的 authorname,再创建的 book1,book1_ptr 会把多出来的 '\x00' 覆盖掉。
2020-8-6 11:32
0
游客
登录 | 注册 方可回帖
返回