MISC-签到
打开exe文件,报错,出现opencv的字样,估计是图像识别,果断打开摄像头,发现人头会被绿圈圈出,题目是三人行,因为是单人队伍,只好手机百度人像让他识别了。
RE-easyGo
第一天就一道re,easygo,百度查可能是go语言写的,找不到函数入口,然后这题几分钟就被人秒了,我就估计是非常简单的,然后直接查字符串,flag、congr、correct、Try之类的,最后发现几个说明flag正确或失败的字符串都在sub_495150被调用,然后在几个调用点下断点,就发现flag在寄存器里
PWN-your_pwn
溢出点挺明显的,对数组边界没有进行检查,造成任意地址写入和任意地址泄露
因为程序开了NX和PIE,所以在执行ret2libc的时候要先泄露地址
初步想法是
拿到返回地址
计算出rop rdi
计算出system_plt
拿到栈地址
计算出/bin/sh的地址
下一轮
放入/bin/sh
修改返回rop
修改/bin/sh_addr
修改system_plt
Objdump -s pwn查看程序plt表,没发现system,但是发现了puts
因为程序加载的基址是不会对地址最后12bit进行随机化的,所以可以根据后12位判断libc库,https://libc.blukat.me/
写泄露脚本
1 | from pwn import * |
可以看到返回的值,puts遇到/x00会结束
但是这里我遇到了一个坑,就是我kali环境下gdb里显示栈里存放的是libc_start+231,导致我在把获得的后12位去libc库上查不到,之后我想找几个ubuntu的libc查查89 c7 e8 f9 97 01是否存在,然后第一次就在我的ubuntu16上找到了
一算偏移发现是240,于是构造脚本
1 | from pwn import * |
结果就成功拿到进入shell,这次比赛比较奇怪,拿到shell后弹出的是congritulation,然后输入token值就拿到flag了,不懂是怎么实现的,原本我还想现学现写个Dynelf的leak函数来搜索内存的,就是在puts后面再放个libc_start的地址,构成一个可以不断循环的leak函数,然后调用Dynelf函数就能搜索指定的函数起始地址了。
第二天看了眼babypwn没思路,加上有事就没打了
评论加载中