ichunqiu-CTF-2017-2
0x00
事后复现的,一些技巧也是第一次遇到。
Black_hole
1.vuln
主函数
1 | void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) |
漏洞函数,栈溢出。
1 | size_t vuln() |
2.tips
不断ret到main函数,循环读取输入,写完payload之后,ret到ret这个gadgets,去执行ROP。
因为是动态链接x64的程序,所以ROP构造直接使用通型gadgets去构造。
程序没有leak,开始我的思路是读取很多,去使用ret2dlresolve的思路去搞,没搞好…
后来看了作者分享的exp,才发现可以:覆盖alarm@got最后一字节,爆破的手段,找到syscall…然后就是布置好寄存器,起shell了。
3.exploit
1 | from pwn import * |
fast-fast-fast [未完成]
1.vuln
fastbin的利用,目标就是控制fd指针,然后分配到自己想要的地址,正好全局指针都在.bss
。
程序的漏洞是double free
。
1 | __int64 __fastcall delet(__int64 ptr) |
2.tips
利用过程:
- 分配一个fastbin,然后释放掉
- 分配一个smallbin,然后释放fastbin(其实这里释放的是smallbin)
- 再次分配刚才释放掉的块(fastbin的菜单里)
- 编辑释放块,这里要伪造chunk
- 调用saysercrt()分配fastbin
- 分配的想要的块(得到一个.bss上的指针)
- 之后利用edit功能,可以完成任意地址读写
不过要注意的是,程序静态链接的…所以为了得到一个任意地址读,选择覆盖.bss:00000000006C3750 __free_hook dq ? ; DATA XREF: ptmalloc_lock_all+CDr
为.text:00000000004082A0 sub rsp, 0D8h ; Alternative name is '_IO_printf'
在开启NX的情况下,
1 | $ checksec fast-fast-fast |
只能ROP了,要么ROP起shell(syscall那种),要么mprotect改写内存属性执行写进去的sc。
3.exploit
在完成任意地址读写之后,ROP链还没构造好…难过
1 | from zio import * |