cstc部分pwn
1.bank
直接拖入ida分析,password是由fgets函数读取的,因此当生成的第一个随机数为0xa时,密码就会被截断,即为0xa。
可以发现flag被读入栈中,并且有格式化字符串漏洞,经调试后当输入%8$s时即可读出flag。
编写exp时,因需要爆破,所以当读到flag就用sleep()函数来使程序暂停,exp如下:
1 | from pwn import * |
2.auto
托入ida分析后发现一大堆重复函数,导致不能反汇编,因此我们需要通过patch来跳过这些重复函数。patch方法如下所示。
patch结束后再反汇编得到伪代码如下所示。
此时代码逻辑就变得很简单,complex_functin
函数为加密函数,编写解密脚本使其进入aas
中的login
,脚本如下
1 | a2=0 |
login
函数如下所示,可以发现scanf函数没有限制长度,因此可以输入任意长度造成栈溢出,将返回地址改写到后门函数,拿到shell
exp如下
1 | from pwn import * |
3.paper
给了libc,先确定libc版本,可以直接./libc.so.6
查看版本,也可以通过在线网站利用中两个函数的偏移确定版本,发现是libc-2.23。
分析各个函数作用,发现free后指针未置0存在uaf漏洞
这两个函数一个泄露了栈地址,另一个是修改栈地址
然后发现有后门函数,且v9在被泄露地址的变量的下方
因此我们可以改变v9的值来拿shell,现在我们利用uaf漏洞,先申请一个chunk,再释放。又因为free后指针没有置0,我们可以利用第三个函数来改写fd指针。
改写fd指针为目标地址后再连续申请两次chunk即可得到我们的目标chunk。现在还缺一个目标地址,利用第4个函数泄露出栈地址,再用第5个函数改写栈地址为0x21(fastbin会检查size域),然后申请两次chunk即可改写v9的值。
exp如下
1 | from pwn import * |
5.manages
libc版本为2.27
思路是先泄露heapbase以控制tcache,再泄露libc_base,然后打__free_hook。
free后指针未置0。
这个change_summary
函数的作用是free掉*(bookcase[v1]),并申请一个chunk进行替换。
通过此操作可以泄露处heapbase
1 | add(8,'0',0x89,'0')#0 |
泄露出heapbase后利用doublefree以申请到tcache来控制tcache,然后将0x250对应的counts改为>7的数,再free掉tcache以获得libcbase的基地址。
exp如下
1 | from pwn import * |