2022 bluehat
初赛
EscapeShellcode
程序会申请一块堆地址,拥有执行权限,把每个寄存器都设为了0xdeadbeef。
image-20220710160145324
image-20220710160128054
同时开启沙箱,只允许调用write。
image-20220710160040693
程序会读取flag放入到bss上。
image-20220710160333732
最后就是进输入,再把我们输入内容进行调用,所以就是要去写shellcode,从而把bss上的flag读出来。
image-20220710160252649
我的思路为:因为开启沙箱,那么就会存在许多的堆块,这些堆块上是会存在脏数据的,通过数据得到libc地址,再去读取出libc中的environ变量,得到其中的栈地址,在通过栈上存放的程序地址而得到bss地址,最后输出flag。
清空寄存器。
image-20220710160709797
image-20220710160728217
得到脏数据。
image-20220710160841237
得到PIE。
image-20220710160913734
成功打印flag。
image-20220710161001175
该方法有缺陷,在于environ在不同的版本的偏移不同,所以需要找对libc版本,限制较大。
其他师傅的思路:直接打印数据,循环打印,从堆地址开始往上打印内容,直到打印出flag停止。这个就不需要版本内容,简单粗暴。
1 |
|
Bank
因为少个队友,被迫去做了电子取证,加上上一题pwn卡了挺久,这题没机会做。
这题就是代码稍微比上题多了点,但难度不大,不过我觉得其中运用到的利用思想还是挺重要的。
一开始申请了一个0x18的堆块,注意这边是直接把地址的值作为一个int64类型赋值的,我一直以为是指针。。。导致后面的打印函数理解出错,后面花了不少时间才通过gdb调试发现问题。
image-20220721110736248
整个程序是模拟银行,刚开始程序的login以及取钱就不细说了。多提一个:就是这边的存钱也是有问题的,相等时是不会扣除money,我还以为后面会需要刷钱,结果貌似没用上。
image-20220721111312570
在进入到转账函数中,发现还有五个菜单函数,功能如注释。
image-20220721111429579
打印函数的话有要求只能打印堆地址+0xf8以后的内容,所以要进行合理堆块布局
image-20220721111554666
最后一个函数功能是可以对堆的fd指针指向地址写入一个值就退出,那毫无疑问,修改fd为exit_hook,再劫持exit_hook为ogg。
image-20220721111644535
因为最后是需要修改heap_ptr的fd指针的,所以还需要多泄露一个堆地址,这个通过2.31版本会在bk上添加key值来获得到tcache的地址。
而要获得libc地址则是去构造fake chunk,让其size大等于0x420,申请堆块去填补差额size,别忘了去垫堆块防止合并,最后把fake chunk释放掉,再通过malloc稳定申请0x18堆块去移动libc地址。fake chunk最好离heap_ptr近一点,这样可以少申请堆块就能泄露libc。
image-20220721113422895
成功!
image-20220721110556403
1 |
|
- 本文作者:ShouCheng
- 本文链接:http://shoucheng3.github.io/2022/07/10/2022-07-10-bluehat/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!