BugKu Test PWN、Reverse、Web Writeup
按我的做题顺序说吧 pwn1
|
|
这里的主要逻辑是,从/dev/urandom中获得一个随机数,然后作为随机数种子生成随机数,然后让你输入随机数,输入10个如果都对了,那就getFlag(),但是我之前对随机数不太了解。我这道题的入口点是上面一个不太让人注意的函数 read_name();
|
|
这里看似好像没什么问题,但是我仔细研究发现了问题。 读入长度的时候用的是%ld,这个是有符号的整数。 判断的时候也是有符号的判断,是否 <= 0x30。 问题就在于下面的循环,这个循环中与i进行比较的时候,这个i和v2在这里都是无符号的整数,这就导致了。 如果我在上面的地方输入-1,就可以绕过限制。 但是这个payload需要精心构造。 s[80]这里的0x50的长度肯定没问题,有问题的在于可能覆盖到的v2和i,这两个是在循环中不停变化的变量,我们应该让他保持不变。 所以v2应该是原来的值-1(0xFFFFFFFF),当然如果是其他大一些的数也不影响。 i应该是当前的i不变化,那怎么不变化呢?只能计算一下在这之前输出了多少的长度,然后按照同样的长度写入。 这里要注意的是,虽然数组下标是从0开始的,但是这里数组读入到这个位置的时候,我们要填入的应该是下个位置的下标。
|
|
pwn2 简单的格式化字符串漏洞。
|
|
要注意的是
- 这道题格式化只读入0x31个字节,所以用%hhn写入的话,长度会不够,所应该用%hn,也就是short写入,int的话文本太长了。
- 传入的"flag" 16进制内容 要大小端转换一下
- 如果要使用这个fmtstr_payload,在x64下要设置一下context.arch,否则传入的是32位的指针。
- 这道题直接调试会有问题,用IDA调试可以选择忽略异常。 我这里直接用fmtstr_payload处理。
|
|
call Shift + F12找到对应字符串,Ctrl + X找到对应引用。 在比较的地方下断点,然后查看比较的字符串内容。输入内容,得到flag
word 先是异或解密
|
|
我这里直接从ida里面导出内容,解密得到password:snaFRf 接下来选择1会释放一个Word文件,文件有密码,密码从2选项中可以得到。 2选项是一个迷宫,找到迷宫数组然后手动导出。 整理一下可以得到
|
|
观察迷宫知道从s进入,然后从d逃出。
wasd控制方向,手动模拟一下。
得到
sssddwwwddddddssssaaaa
输入之后得到Word文件的密码,成功打开文件获取到flag。
迷宫题做多了,眼不花手不抖了,以前手动模拟一次还要做错,以后就hhhh了。
等下写个自动寻路的程序,以后都上自动化了!
|
|
安慰奖 代码:
|
|
这题思路: 查看源代码解码出来是backups,想到备份文件。我试了www.zip 等等,没试出来。 但是用burpsuite跑出来了,是index.php.bak,下载下来可以审计代码,发现是一个反序列化漏洞。 结合CVE-2016-7124成功利用。
学到的内容:
%00%00
代表是private%00*%00
表示是protected- 可以用
\
来绕过检测 - 可以用
`ls`
来执行shell,反引号内的内容是直接执行shell - CVE-2016-7124,
__wakeup()
魔术方法绕过,绕过方法为字段数和实际字段数不匹配。 - 魔术方法介绍:https://www.php.net/manual/zh/language.oop5.magic.php 漏洞影响版本:
|
|
Payload:O:3:"ctf":3:{s:11:"%00*%00username";s:5:"admin";s:6:"%00*%00cmd";s:13:"ca\t%20flag.php";}
史上最严过滤
上传.htaccess,然后上次jpg文件,最后上次jpg格式的php代码,代码过滤了很多内容,不过可以绕过。
最后shell:<?= $_GET[a]($_GET[b]);
uoload.php代码
|
|