正则表达式的使用
最近在和战队一起的比赛中又出现了诸多想要学习的知识点,那就是re和QRcode,今天先学一下这个正则吧。
那么我已开始接触正则呢,应该是在学爬虫的时候,因为当时爬虫学的不太好也就没有接着学正则匹配。后来在换了linux系统之后经常会用到一个很有用的东西,那就是|grep。不得不说这个在找东西的时候真的是很有用的,比如
1$ls -l | grep ""
那么本次和Nepnep战队参加xctf分区赛也是有一道修复二维码的题目,当时师傅们可能有些点没注意到,导致最后修复的二维码多达16000的扫描结果。
得到结果之后本以为要经历漫长的人工过滤,可是咱们战队的一位爷爷直接solved,而这位爷爷就是直接用了正则匹配。
正则表达式
正则表达式(英语:Regular
Expression,常简写为regex、regexp或RE),又称正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
许 ...
SWPUCTF_2019_p1KkHeap writeup
buu刷题记录—SWPUCTF_2019_p1KkHeap
这波又刷新了我对2.27版本libc的认知。那就是tcache struct
,话不多说看题。
静态分析
64位保护全开,习惯就好。载入IDA查看发现plt表有很多函数,其中有mmap和prctl,prctl最常见的就是设置沙箱规则,mmap最常见的就是直接给一个可读可写可执行的一片内存区域,那么我们返回终端查看一下沙箱规则。
这个有点复杂,不过大概率就可以认为他给你禁用了execve,其它的基本不用管,大概意思就是write函数的count必须非负,且大小在32位int范围内,并且不能=0x10,有一说一这个0x10并不理解为啥限制这个不能等于0x10,因为我读flag一般是读0x40
我们看看初始化函数,可以看到mmap分配了一片很大的内存并且是可读可写可执行的权限,那么开了沙箱之后我们就能往里面写orw的shellcode,然后再劫持某些东西让它跳转到这个区域。
分析逻辑,
经典堆菜单题目,包含了增删改查,但是有一个全局变量一直在++并且循环并非while
1,可以发现这个初始值为0x12,意味 ...
npuctf_2020_level2 writeup
buu刷题记录—npuctf_2020_level2
这题刷新了我对格式化字符串的利用,来康康吧。
静态分析
十分简单,就是主函数while循环输入然后格式化字符串漏洞,但是不同的是这个格式化字符串并不在stack段而是在bss段上的。那就考虑考虑字符串在bss段和在stack段的区别,我们平时做的都是在stack段的,因为buf输入一般都是在printf调用之前,所以printf的栈帧会比buf低,而参数在高地址,那么此时printf的参数我们就可控,在buf上写上一个地址然后算出偏移用%n格式串去写就能基本达到任意title写的目的。但是如果它在bss段上或者是在堆上,那么格式化字符串的参数控制不了我们就得另寻方法了。其实也还好,第一步我们可以先控制一个栈的参数,栈里面都会有存函数的ebp,那么可以通过这个来写一个目的地址,再通过目的地址任意写我们想写的内容。讲简单一点其实也就是控制一个栈的地址然后写上目的地址,最后再往目的地址写东西,有格式化字符串漏洞那么基本stack,code和libc地址跟送的一样随便泄露。
动态调试
先gdb起这个程序,然后运行到printf ...
de1ctf_2019_weapon writeup
buu刷题记录—de1ctf_2019_weapon
静态分析
checksec一波,保护全开,ida分析,发现时经典的堆菜单题目。有add,delete和edit操作,没有show函数,并且保护全开无法劫持got表。那么这题大概率是要用IO来泄露libc了。
add函数把堆块申请范围限制在了0x60以内,也就是说我们只能申请fastbin大小的堆块。edit函数就是中规中矩的按照之前的size修改堆块的内容。delete函数在堆块被free之后没有把指针置空存在UAF的漏洞。那么我们的思路大概就是先通过uaf进行堆块重叠然后修改size,free之后得到一个unsorted
bin,然后再修改回fastbin将它申请到stdout附近通过IO泄露libc地址,最后再来一次fastbin
attack劫持malloc hook放上onegadget 去getshell,这题需要用realloc
调整栈来适应onegadget,我们后面再说。
泄露libc的地址
因为地址都是未知的,所以一开始要通过释放两个相同大小的fastbin来让其中一个fastbin中留下另一个 ...
2021浙江省赛pwn2复盘
这题在比赛是没有做出来的,属于赛后复盘,但是感觉这题不该在比赛做不出来,因为赛后花了两小时就出了。
静态分析
首先checksec发现保护全开了,ida打开,主函数是一个while 1
循环且没有return,如果要栈溢出得在其它函数。首先ida分析有部分不到位,有一个很明显的值赋值指针,然后后面还有对指针之后的元素读取一个int型变量,很明显栈布局是这样的。
1234char buf[]char *ptrint size
然后我们去混淆一下,去除那个指针刚好是31个int_64,把它改变一下就是char
buf[248],如下更方便分析(isnan函数是因为去除了alarm方便调试)
可以很明显的看到中间有两层检测,但是一旦不满足最外层那个检测那么就会循环输出too easy,因此我们看看这个判断是什么,这个判断的意思就是我们的指针只有在>=缓冲区地址或者<=rbp-0x220才允许执行下面的流程。因为栈是向低地址增长,所以第一个判断就是ptr要落在buf或者buf下面(栈底方向)。如果我们有机会修改ptr,那确实可以通过ptr任意写,而我们之前分析 ...
wdb2018_guess writeup
buu刷题记录:wdb2018_guess
静态分析elf文件
checksec一下发现开了NX和canary保护,64位程序,用ida分析看看
很明显的gets栈溢出,并且gets之后没有回显输入的内容,那这样的话意味着不能栈溢出劫持控制流了。那么看看前面,发现有一个把flag文件内容读到栈上面的动作。后面while循环调用了一个sub_400A11函数,v7=3,v6=0,,v7>=v6
break就意味着这个函数会被调用三次。而发现sub_400A11函数是调用fork函数,fork函数会创建和当前进程一模一样的进程,然后范围自身进程的ID,如果是被创建的进程,那么fork将会返回0。
简单点就是fork的子进程会返回0,如果返回0那么break执行下面的内容,父进程因为返回自己进程号不会break则继续循环,然后调用fork,也就是说这个进程一共会产生3个子进程执行while循环之后的内容。
这里有一个特性,那就是在发生栈溢出之后stack_chk_fail。在终止程序之前还会打印argv[0],这一点很合理。但是这里可以用于泄露栈上的flag,我们如果g ...
网鼎杯2020青龙组singal writeup
不知不觉做到了虚拟机逆向了,曾经我也只是听说,还未曾想也能自己做出。
静态分析文件
exe文件,先查壳,没有壳直接ida打开。
main函数逻辑还是比较简单的,先拷贝一串内存给v4,v4再作为第一个参数给vm_operad函数,第二个参数是114。
那么我们先提取它拷贝的内存,至于这段内存如何使用那就进去分析vm_operad函数了。很明显,这个第一个参数是int类型的,并且也没有对a1做强制转换之类的关系,那么很明显这个内存是一个int数组,那么用提取成char数组之后再用int
类型去输出它就能得到对应的int数组。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include<stdio.h>#include<bits/stdc++.h>unsigned char s[] ={ 0x0A, 0x00, 0x00, 0x00 ...
WUSTCTF2020 level4 writeup
好久没刷re了,来刷点re啊。
buuctf的[WUSTCTF2020]level4
静态分析文件
下载发现是一个64位的elf文件,IDA打开分析。照例先看看明显的字符串明文,发现有left,right,然后还有三种打印(type1,type2,type3)。观察符号列表发现有type1和type2函数。跟进去发现跟我们二叉树的递归输出十分相似,并且type1
先递归了a1+1再递归a1+2,差不多他们就是左子树和右子树。那么type1就是一个后根遍历。然后type2是再中间输出的,是一个中根遍历,那么type3大概率就应该是先根遍历,这里他没有,那么先根遍历大概率就是flag。根据中序遍历和其它一个遍历可以求另外一个遍历,这个在数据结构课里有讲。
动态调试
那么先运行一遍可以发现得到了两个结果
正解显然就是考一个数据结构嘛,但是一个题目总得有多种解法,这里我选择修改函数结构,让它从一个后序遍历变成先序遍历,这里需要patch
elf我们先找到type2函数观察它的汇编代码
很明显
1jz short loc_4007FD
这一条指令对应了 ...
ciscn2019_final_3 writeup
buu刷题记录:ciscn_final_3
写在前面
今天解决了C++文件换版本的问题,也是一刻没耽误直接做了这道C++题目,不得不说太爽了啊,再也不用因为题目是C++写的就做不了了,话不多说来看文件。
静态分析elf文件
题目告知是ubuntu18版本的,给了libc.so.6文件,但是盲猜跟它自己的一样,那就先换好elf文件的版本。checksec观察保护全开。然后IDA打开一看,发现是经典的堆菜单题,提供了两种操作,add和delete。delete很明显free之后指针没有清零,存在UAF漏洞,并且add只允许下标开到0x18,也就是0~24总共能add
25次。然后大小限制在了fastbin大小的范围内,但是很贴心地,每次add之后给了malloc之后的地址。那么大概率通过这里泄露(ps:一开始并没有想到,还想着用IO泄露来着的),思路大概是先通过一次double
free修改一个chunk的size为其它大小,然后free一次,再修改成非fastbin范围的堆块,并且防止堆块放入unsortedbin被check
fail,最好不要构造堆相互重叠(这句话的 ...
2021浙江省决赛
2021省赛决赛题解
总结
本次比赛最终rank21,幸而拿到省赛一等奖最后一名。pwn题签到拿下二血,re签到拿下还是好的,但是pwn少拿了一道有点可惜。最终还是靠学长ak
web才拿下的省一,希望学长明年还能带我。下面放出本次比赛提交的wp,misc和cry因为没有留下图片(就是wps复制过来的,导出pdf之后交了,后面word删了图片也就没了)。
Web
远古特性
换行绕过
1hint/hint.txt%0a../../../../../../flag
just login
12345678910111213141516171819202122232425import requestsurl = "http://8fd95e2e-9d91-45b1-8ba9-d41be0125b3f.zj-ctf.dasctf.com:80/login"flag = ''data = {"username": "123' oorr 1=1 -- ", "passwo ...