上周的wp我咕了,图片太多,云不想弄,第三周堆有点难受,之后把tcache抽空学一下
Pwn
namebook
打开程序,五个功能,没有开启PIE,没有后门函数以及system,需要泄露
64为程序中,每一次创建的chunk是0x80大小,实际大小0x90,最多建立10个name
1 | struct eachname |
分析一下个函数有啥问题
1 | int set() |
我们可以看到初始的ptr在bss字段上,bss字段上存放的数据只有data,通过覆盖我们可以修改bk的pre_inuse,从而执行在freechunk1的时候unlink chunk0
一开始是想unlink完直接该got表内容,但是vmmap看了一下,got表是不可写的,唉RELRO真难受
问了aris,提示是malloc_hook,free_hook
malloc函数会首先检查malloc_hook的值,若不为0则会调用他。若我们能通过内存写入malloc_hook即可实现任意地址跳转
调试的时候坑还是挺多的
exp
1 | #coding=utf8 |
知识点:unlink、free_hook、分析堆块在bss字段上的结构体
薯片拯救世界3
检查一下程序有啥,有一个backdoor函数,partial relro,没有pie,我现在的想法就是把got表改成backdoor
函数主体如下
1 | while ( 1 ) |
四个功能,第四个就类似于推出,主要就是创建,编辑,发布
每个notice是依次建立的chunk,最多建10个
chunk基地址是0x00000000006020C0
1 | struct notice |
漏洞如下
1 | void send() |
别的漏洞还没有看出来
引用一下ctf-wiki上的话(我难得看得懂的部分)
Fastbin Double Free 是指 fastbin 的 chunk 可以被多次释放,因此可以在 fastbin 链表中存在多次。这样导致的后果是多次分配可以从 fastbin 链表中取出同一个堆块,相当于多个指针指向同一个堆块,结合堆块的数据内容可以实现类似于类型混淆 (type confused) 的效果。
Fastbin Double Free 能够成功利用主要有两部分的原因
- fastbin 的堆块被释放后 next_chunk 的 pre_inuse 位不会被清空
- fastbin 在执行 free 的时候仅验证了 main_arena 直接指向的块,即链表指针头部的块。对于链表后面的块,并没有进行验证。
exp
1 | #coding=utf8 |
知识点:aris带我算了一遍fatbin中chunk的范围,bin不够了要绕过范围之类的
Steins;Gate3
1 | .text:0000000000000C78 ; __unwind { |
区别就在这里,command可以我们自己靠rbp偏移去解决掉,调用我们自己想要的command
所以也就只有最后以快不一样,因为我们不需要完整的PIE了,泄露与rbp有关的地址在进行偏移就好调整就好
因为一开始想的是gate2执行了两次main,然后我也泄露出了完整的PIE,再执行一次main,把rbp泄露出来就好
exp
1 | #coding=utf8 |
babytcache
这题paitial relro,no PIE,闻到了改got表的栖息,提示说可利用格式化字符串进行读写
同时题目还涉及到tcache这一种比较新的缓存机制,完全不会,现学
学习资料:https://www.360zhijia.com/anquan/371580.html
以下介绍全部来自学习资料,就是为了自己看起来方便点
简单地说,它对每个线程增加一个bin缓存,这样能显著地提高性能,默认情况下,每个线程有64个bins,以16(8)递增,mensize从24(12)到1032(516)
每个bin是单链表结构,单个tcache bins默认最多包含7个块
释放时,_int_free中在检查了size合法后,放入fastbin之前,它先尝试将其放入tcache
在_int_malloc中,若fastbins中取出块则将对应bin中其余chunk填入tcache对应项直到填满(smallbins中也是如此)
在__libc_malloc,_int_malloc之前,如果tcache中存在满足申请需求大小的块,就从对应的tcache中返回chunk
unsorted bin 我还没接触过,先放一放,来看看题目
程序主要就是如下四个功能
1 | void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) |
分析一下有啥漏洞
add函数
1 | int add() |
能创建10个chunk,首地址在0x6020E0,每次创建的大小固定为0x60,结构体和之前的题目一样,就是一个指针,ptr[i]放内容,没什么毛病
delete函数
1 | void delete() |
show函数
1 | int show() |
没什么问题感觉
Misc
听听音乐?
音频里面可以听出来有摩斯密码,用Audacity打开,然后翻译摩斯密码
1T_JU5T_4_EASY_WAV
Crypto
babyRSA
直接egcd,然后失败,发现公约数e与(p-1)*(q-1)的公约数4,直接e/4=3,感觉是小指数的RSA问题,失败,老老实实做
我自己python精度不够,gmpy2还没下下来,后来用matlab,mma算的,想办法弄个gmpy2下来
1 | def hcf(x, y): |
Web
sqli-1
刚点进去有个md5要我绕过,在请教大佬之后知道可以爆破,用我之前爬虫题里的学的一点点正则匹配下来code,不断爆破……
我看了一些网上的教程,这题我一开始都不知道要输入啥,只能猜数字了
1.0,1,2,3,4一直猜,注出来个welcome to hgame
2.0 union select database() 数据库名字是hgame
3.0 union select table_name from information_schema.tables where table_schema=’hgame’
出来表名 f1l1l1l1g 和 words
4.0 union select * from f1l1l1l1g 得到flag
sqli-2(未完成)
输啥都没反应,问了下出题人要爆破databse或者table,存在⼀个execute和error的提示
去理解了一下sleep的手法
另外从网上学到了一个姿势:ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
链接:https://www.cnblogs.com/lcamry/p/5763129.html
payload: 1 and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=%d,sleep(3),1)
试试看合在爆破脚本里怎么用,code变太快了,我失败了,坐等wp,纯手工来一波……
记录一下成功的语句:
1 | 1 and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=70,sleep(3),1) |
table_name: F11111114G
不想猜列名了,直接select * 搏一搏,单车变摩托,不行,告辞,来段名,中间还是用了二分法
1 | 1 and if(ascii(substr((select column_name from information_schema.columns where table_name='F11111114G' limit 0,1),1,1))=102,sleep(3),1) |
colum_name:fL4444G,还最后一步了
1 | 1 and if(ascii(substr((select * from F11111114G limit 0,1),1,1))=104,sleep(3),1) |
hgame,我投降了
本文链接: http://woaixiaoyuyu.github.io/2019/02/16/hgame2019-week3-wp/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!