暑假BUUCTF抄题记录

[GKCTF2020]Check_1n

IDA查看字符串的方法:View→Open subviews→Strings。快捷键:Shift+F12

[V&N2020 公开赛]strangeCpp

工具StudyPE的“导入”一栏可以删除导入的DLL。
题目中有个简单爆破的地方,用python和c得到的结果是不一样的。原因是用c写的时候,计算后会溢出,这是正确答案,而python无限大数。所以写脚本的时候要注意不是什么时候都用python。

[ACTF新生赛2020]easyre

PEID查壳,upx.exe -d easyre.exe脱壳,如果用powershell要注意文件名格式。脚本注意:字符串中存在引号,需要用\转义。由于题目中索引减去1,所以循环条件要设为for j in range(1,len(data)+1)

[GUET-CTF2019]re

python安装z3约束求解器,换源安装快一些。python -m pip install z3-solver -i https://pypi.doubanio.com/simple
写脚本时没有注意到,题目没给出a1[6]的值,这样最后的flag就少了一位。不仅如此,题目还把a1[16]和a1[17]的位置给倒过来了,因为我一开始没用z3,而是用append()硬写,所以忽略了这两处陷阱。
然后学了一下burpsuite,切换jdk版本的时候出了一些问题,注意设置系统环境变量。因为只需要爆破一处,注意攻击方法不要选择cluster bomb。(不过我爆破buu发现并不能成功找到flag...)

[FlareOn4]login

关键代码如下:

var flag = document.getElementById("flag").value;
var rotFlag = flag.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);});
if ("PyvragFvqrYbtvafNerRnfl@syner-ba.pbz" == rotFlag) {
    alert("Correct flag!");
}

问同学一晚上加查阅总算看懂了...看不懂的请直接移步JavaScript replace() 方法
首先说句题外话,python没有a = 3>2 ? 4 : 6这样的三目表达式,取而代之的是a = 4 if 3>2 else 6这样的实现方式。
我对题目代码不理解的地方主要有两处:第一,function(c)c这个参数是什么;第二,为什么赋值语句会被当作比较运算的一个操作数,赋值语句的返回值是什么。查阅后,得知赋值语句的返回值是右边的值。对于第一个问题,看下图。

所以,题目中的参数c其实就是函数的第一个参数,也就是匹配成功的字符串,在本题中,匹配成功的字符串是一个大小写字母。虽然只是一个字母,但它的类型是String,所以后面可以对c使用charCodeAt()这样的函数。注意匹配模式/g,所以会替换所有匹配成的字符串而不仅是第一个成功匹配的字符串。
接下来看函数的内容。

  • 首先第一部分,假设有个临时变量tmp1,那么tmp1 = c <= "Z" ? 90 : 122c和"Z"都是字符串,大小比较应该是字典序比较,但因为匹配模式,我们知道其实c就是一个字符,c和"Z"的大小比较其实就是ASCII码比较。已知"Z"的ASCII是90,若c是大写字母,则tmp1为90,若c为小写字母,则tmp1为122。
  • 第二部分,假设有个临时变量tmp2,那么tmp2 = (c = c.charCodeAt(0) + 13)。我们知道c其实只有一位字符,所以c.charCodeAt(0)其实就是c的唯一字符,就是它本来的样子。所以tmp2其实就是原来的c加上13后的值,我们上面说到赋值语句的返回值就是右边的值。注意,这是一个赋值语句,所以在此时此刻, c已经改变了,变成了原来的c+13。
  • 再假设有个临时变量tmp3,则tmp3 = tmp1 >= tmp2
  • tmp3为真,那么函数返回值为c,否则函数返回值为c-26。函数的返回值就是一次替换后的一个字符串。
  • 接下来看所有情况:
    • 情况1:c是一个大写字母,符合c<="Z",即c<=90,所以tmp1的值为90,也就是"Z"。而tmp2的值可以简单理解为c+13。若90>=c+13,即tmp1>=tmp2,则tmp3为真,返回值是c。此处的c是原来的c加上13。此时,原来的c的范围是"A-M"。
    • 情况2:c是一个大写字母,范围是"N-Z",tmp3为假,返回值是c-26。此处的c是原来的c加上13。可见,对于大写字母,其实就是一个rot13。而由于13是26的一半,加密和解密是完全一致的。
    • 情况3:c是一个小写字母,不符合c<=Z,所以tmp1的值为122,也就是"z"。后面就同理了,也是对小写字母进行了一个rot13。

综上,其实这个替换就是将所有的大小写字母换成了移位13位后的大小写字母。对题目中给出的替换后的字符串再执行一次rot13就可以得到flag了。

[V&N2020 公开赛]CSRe

用exeinfo pe来查看文件,发现有混淆,再用de4dot去混淆,然后用dnSpy打开去混淆后的文件,查看Class3的主函数。
注意用这个 https://www.cmd5.com/ 网站进行sha1解密,之前用另一个网站失败了。

firmware

下载下来是一个.bin文件,直接binwalk -e分解出来一个120200.squashfs文件。
安装工具参考linux安装firmware-mod-kit
进入firmware-mod-kit文件夹,执行./unsquashfs_all.sh /mnt/hgfs/1/120200.squashfs /mnt/hgfs/1/extracted/来解压这个120200.squashfs文件。

在tmp路径下找到backdoor文件

再用神器exeinfo pe查看backdoor文件,发现有upx壳

upx -d backdoor脱壳,丢进IDA。SHIFT+F12查看字符串发现网址echo.byethost51.com,双击进去,右键查看交叉引用

进入initConnection函数,找到端口值36667

按照题目要求进行md5提交即可。

posted @ 2020-07-13 00:17  平静的雨田  阅读(148)  评论(0编辑  收藏