2019VolgaCTF & 2019SunshineCTF writeup

VolgaCTF: warm/Shadow Cat/JOI Warm 这道题是 arm 架构下的,不过没什么区别。没有环境的话要先搭一下,直接连服务器做也可以。 先简单解个密: s="" s+=chr(0x23^85); s+= chr(ord(s[-1])^78) s+= chr(ord(s[-1])^30) s+= chr(ord(s[-1])^21) s+= chr(ord(s[-1])^94) s+= chr(ord(s[-1])^28) s+= chr(ord(s[-1])^33) s+= chr(ord(s[-1])^1) s+= chr(ord(s[-1])^52) s+= chr(ord(s[-1])^7) s+= chr(ord(s[-1])^53) s+= chr(ord(s[-1])^17) s+= chr(ord(s[-1])^55) s+= chr(ord(s[-1])^60) s+= chr(ord(s[-1])^114) s+= chr(ord(s[-1])^71) p.sendline(s); print(len(s)) print(s) 得到 v8&3mqPQebWFqM?x 程序很明显有溢出,进行覆盖可以读取任意文件,接下来就靠猜了… 文件名是 sacred payload: v8&3mqPQebWFqM?xpppppppppppppppppppppppppppppppppppppaaaaaaabbbbbxppppppppppppppppppppppppppppppppppsacred flag: VolgaCTF{1_h0pe_ur_wARM_up_a_1ittle} ShadowCat 用 john 进行破解,首先用默认的字典,发现破解速度极慢,破解出来的都是单字符,想想也是… 所以自己创建一个可打印字符的字典,使用 –wordlist 设置破解就好了,最后把破解得到的数据与密文对应的字符进行替换,得到 脚本: str = "hajjzvajvzqyaqbendzvajvqauzarlapjzrkybjzenzuvczjvastlj" ans = "" dict = {"z":"_","a":"a","x":"b","q":"c","l":"w","v":"h","e":"i","f":"j","b":"k","r":"l","g":"m","n":"n","o":"x","p":"y","s":"d","c":"e","w":"f","d":"g","t":"o","h":"p","m":"q","k":"u","i":"v","y":"r","j":"s","u":"t"} for ch in str: ans+=dict[ch]; print(ans) flag: pass_hash_cracking_hashcat_always_lurks_in_the_shadows...

CTF | offbyone writeup

offbyone fastbin attack chunk overlap 题目就叫 offbyone,是 xman 小姐姐给的,不清楚出处… offbyone 漏洞的大致思路: 改写下一个块的size 改写下一个块的pre inuse位 chunk overlap : Overwrite next chunk’s size => extend free chunk Overwrite next chunk’s size => extend allocated chunk Overwrite next chunk’s size => shrink free chunk 这道题的 offbyone 比较宽松,可以写任意字节,而不仅仅是 null 程序分析 edit 函数有 offbyone: if ( v1 >= 0 && v1 <= 15 && ptrs[v1] ) { puts("your note:"); v2 = strlen(ptrs[v1]); read(0, (void *)ptrs[v1], v2); puts("done....

CTF | 0ctf 2017 babyheap

0ctf 2017 babyheap writeup 有关 fastbin attack 利用 稍微复习一下 fastbin attack 利用思路: 覆盖 got 表劫持控制流 覆盖栈上函数返回地址,然后ROP劫持控制流 覆盖 malloc_hook、覆盖 _IO_FILE 等方式劫持控制流 没有开 FULL RELRO 的话,就可以考虑修改 got 表内容 算是很经典的一道题了吧 先分析一下程序 allocate: 最大0x1000 fill 关键! 没有设置字符串结尾,而且长度并不是之前 chunk 分配时指定的长度,是自己指定的,所以这里就出现了任意堆溢出的情形。可以用来泄露libc地址,以及构造fake chunk dump 输出对应chunk的内容 free 释放堆块,清空 inuse,size,ptr chunk 结构: +---------|---------+ |prev_size| size | |---------|---------| | fd | bk | |---------|---------| | data | +---------|---------+ chunk 包含三个字段: inuse size ptr 题目中 fill 存在堆溢出,可以写任意长度,注意分配使用的 calloc ,在分配的时候会将分配出来的 chunk 先清空,dump 的大小是根据 alloc 指定的 size 决定的,跟真正的 chunk 大小无关。...