hack.lu ctf 2015 bookstore

Introduction

知识点:

overlapping_chunks

formart_string_attack

books

./books: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=3a15f5a8e83e55c535d220473fa76c314d26b124, stripped

    Arch:     amd64-64-little
    RELRO:    No RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

这题我感觉很坑,先是用堆利用技术溢出格式化字符串的变量,然后再是格式化字符串攻击,最后要非常规 getshell。

程序本身逻辑很简单,malloc 三块 small bin 大小的 chunk,能够任意写入和释放前两块 chunk,但是每次写入后第三块 chunk,也就是存储格式化字符串变量的 chunk 会被设置成固定的字符串,只有构造 overlapping_chunks,才能实现对第三块chunk的溢出。

Exploit

构造 overlapping chunks 相对简单,但要利用格式化字符串 getshell 就难了,程序打印完就结束了,没有循环,在尝试各种已知方法无果后查看了 writeup,发现竟是佛系 exploit。。

但有一点还是学到了,就是写 fini_array,程序退出时会执行 fini_array 中的函数,将其改写为 main 函数地址,可惜这种方法只能使 main 函数再多执行一次,那么在第一次格式化字符串打印的时候我们就要写好 got 表为 system 了。

据 writeup 提供者描述他的 ubuntu 恰好与比赛服务器系统一致,设定好一个 system 的地址,改写 free 的 got 表为 system,那么我以 ubuntu 16.04 64位系统为环境,在观察了系统 system 地址的规律后设定了一个值(发现其两个低字节 总为两种情况),进行循环尝试,在一定时间后成功 getshell。

exp.py

result