首页
社区
课程
招聘
[原创]#30天写作挑战#PWN:House Of Einherjar学习
发表于: 2020-9-14 08:17 15657

[原创]#30天写作挑战#PWN:House Of Einherjar学习

2020-9-14 08:17
15657

用 how2heap 的例子看一下

参考:ec9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2@1L8%4m8K6k6h3y4Q4x3X3g2U0L8$3#2Q4x3X3g2U0L8W2)9J5c8Y4m8%4L8W2!0q4y4#2)9&6b7g2)9^5y4q4!0q4z5q4)9^5z5g2!0n7b7g2!0q4y4W2)9&6b7#2!0m8c8W2!0q4y4W2!0n7y4g2)9^5y4g2!0q4z5q4!0n7x3q4)9^5z5q4!0q4c8W2!0n7b7#2)9^5z5q4!0q4y4q4!0n7b7g2)9^5b7#2!0q4c8W2!0n7b7#2)9^5z5g2!0q4c8W2!0n7b7#2)9&6b7h3I4A6L8Y4g2^5i4@1f1#2i4@1p5H3i4K6R3$3i4@1f1%4i4K6W2n7i4@1t1^5i4@1f1#2i4K6R3#2i4@1t1K6i4K6u0r3

上面文字基本表达完了,但还是调试着看一下叭


首先申请了一个 chunk a,然后在栈上伪造了一个 chunk,为了绕过 unlink 的检查,先把 fd、bk、fd_nextsize、bk_nextsize 直接写成我们 fake_chunk 的地址


image.png


然后申请一个 chunk b,因为前面申请的 chunk 的大小是 0x38,所以 chunk a 共用了 chunk b 的 chunk 头的 0x8,也就是说我们写 chunk a 的最后 0x8 字节可以直接更改掉 chunk b 的 prev_size,这里为了让他能找到我们的 fake chunk,所以用 chunk b 的地址减去 fake chunk 的地址,0x603040-0x7fffffffdca0=0xffff8000006053a0


同时假设存在一个 off by null 的漏洞,可以更改掉 chunk b 的 prev_inuse 为 0


image.png


然后我们释放掉 b,这时候 b 因为与 top chunk 挨着,会跟 top chunk 合并,然后因为 prev_inuse 是 0,所以会根据 prev_size 去找前面的 free chunk,然而 prev_size 被我们改了,他去找的时候找到的是 fake chunk,然后两个合并,新的 top chunk 起点就成了 fake chunk,再次分配的时候就会分配到 fake chunk 那里了

ps.按照这个道理 d = malloc(0x200) 这行代码还没执行的时候,p main_arena 应该看到 top 被改成了 fake chunk 地址的,但是调试的时候显示的是 chunk b 的地址,然而 malloc 之后才显示 top 为 fake chunk 的地址,然而此时 d 的地址已经是在 fake chunk 那里了,不知道为啥


再深入理解为啥会跟 top chunk 合并之类这些问题大概要把 libc 的源码看一下才能理解,等以后吧 Orz

参考:a22K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6^5P5W2)9J5k6h3q4D9K9i4W2#2L8W2)9J5k6h3y4G2L8g2)9J5c8Y4c8Q4x3V1j5$3y4e0f1$3

在 read 的时候有一个 off by null


image.png


程序在 0x602140 这里记录了申请的 chunk 的 size 与指针


image.png


首先需要泄漏 libc 的地址

先申请几个,然后释放掉两个,用来获取 unsorted bin 的地址和 heap 的地址(chunk3 的 fd 指针)


image.png


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

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回