0x00 堆溢出:bb_tcache
山大的题目 第一次接触堆的题目 以前只是看过堆溢出unlink相关的知识
山大题目连接http://47.105.148.65:4000/login?next=%2Fchallenges
先简短解释下这道题堆题用到的知识malloc_hook堆钩
1 | malloc_hook是在调用malloc函数之前检查的地方,正常情况下该地址下的值为0,如果该内存不为0,则会在malloc前先执行malloc_hook中的地址的内容 也就是说如果我们在这块内存写入one_gadget,就会在malloc前执行one_gadget。 |
每次调用堆的申请 释放等函数时候实际会先执行malloc_hook去鉴别 如果malloc_hook内存值不是0 就会执行malloc_hook中存放地址的内容

就是很正规的申请,释放和修改 看一下开了什么保护

保护全开 只能通过leak地址 拖入IDA 静态调试一下

申请两字节 写入一字节 该elf文件是64位 刚好是写入一个地址的大小 下面开始exp的构造
0x01 exp
先ldd一下看一下 该文件用的libc库
1 | $ ldd bb_tcache |
用的就是
/lib/x86_64-linux-gnu/libc.so.6再去找一下这个libc的one_gadget
1 | $ one_gadget /lib/x86_64-linux-gnu/libc.so.6 |
使用需要满足条件 可以一个一个试试 也可以去找当时的寄存器查条件 这里吧详细说明 我们选择使用最后一个
0x10a38c execve("/bin/sh", rsp+0x70, environ)
先把system地址得到 为了后面malloc_hook地址做准备
1 | #!/usr/bin/python |
drop=True是为了不接受到Give 算是个recv的新知识
下面leak一下malloc_hook的地址
1 | libcbase = system - libc.symbols['system'] |
得到地址后就通过修改堆fd指针 通过申请释放修改 再经过2次申请就就可以(不懂得看我前面uaf漏洞介绍)
1 | sh.sendlineafter('4. quit!\n','1') |
第二次申请得到得就是malloc_hook地址 我们需要把one_gadget写入malloc_hook地址内 然后再去执行一次malloc函数 就会因为malloc_hook内地址不为0去执行malloc_hook地址内的内容
1 | sh.sendlineafter('4. quit!','3') |
完整的exp
1 | #!/usr/bin/python |
0x02 格式化字符串:repeater
一道格式化字符串的题 可以先去看一下我前面文件讲解的格式化字符串
先看一下文件的保护

开了NX 堆栈不可执行 我们再托人IDA看看

很明显看到了格式化字符串漏洞的地方 并且后面还调用了puts函数(可以想到got表覆写)

还有一个getflag函数 里面可以使用命令cmd 去看一下cmd是什么命令

刚好是
cat flag 所有可以通过格式化字符串漏洞把 got表中Puts函数地址写为getflag函数就可以 先看一下getflag命令的地址是什么1 | .text:080485D5 sub esp, 0Ch |
可以看到从080485d5开始了system的操作 去看了一下got表中puts的位置
1 | got.plt:0804A014 off_804A014 dd offset puts ; DATA XREF: _puts |
发现前前2字节是一样的 只需要去覆盖低字节的2个就可以
85d5转10进制是34261 下面开始构造exp
0x03 exp
1 | #!/usr/bin/env python |
2018.11.15更新
repeater发现自己做法并不是最正确的 官方给出的题解用了fmtstr_paylaod函数
也是第一次见第一次使用 一个三个参数一个偏移位置 一个要写入的地址 一个写入地址的指 下面直接看exp
1 | from pwn import * |