NCTF Crypto WriteUp

http://ctf.nuptzj.cn/challenges

Crypto篇:

第一题、第二题、第七题和CG-CTF一样,不写了…

第三题:

说了全家桶,那就python跑吧…

Flag:nctf{base64_base32_and_base16}

150分到手

第四题:

鬼知道进行了几次…

首先把base.txt中的回车都搞了,Notepad++吧,嗯。\r\n替换为空搞定。

搞完了就写个脚本跑一下,先跑他个100次试试…

# coding: utf-8

import base64

f = open('base64.txt','r')

str = f.read()

for i in range(0,100):

       str = base64.b64decode(str)

       print (str)

跑到出错,flag就出现了

Flag:nctf{please_use_python_to_decode_base64}

200分到手。

用Python解base64,嗯,记住了。

第五题:

给了个php函数。

大概思路就是先反转字符串,然后每一位都把它的ASCII码加一,然后反向打印base64,再rot13编码…

咋这么多步骤,那就php走起吧…

写了个php

<?php

$str = "iEJqak3pjIaZ0NzLiITLwWTqzqGAtW2oyOTq1A3pzqas";

$str = base64_decode(strrev(str_rot13($str)));

$_str = "";

for ($i=0;$i<strlen($str);$i++) {

       $c = substr($str,$i,1);

       $__ = ord($c) - 1;

       $c = chr($__);

       $_str = $_str.$c;

}

echo strrev($_str);

?>

放到phpStudy中跑一下,出结果。

Flag:nctf{rot13_and_base64_and_strrev}

250分到手

第六题:

给了个py

woc你是有毒吗?

人工解密吧,反正就十次…

第一次一看没有小写字母,base32,第二次只有数字,应该是base16,第三次只有数字和A-F字母,base16,第四次大小写都有,base64,第五次,base16,第六次,base64,第七次,base32,第八次,base16,第九次,base32,第十次,base32,然后出来了

真累,有没有别的办法…

百度了一下别的wp,

https://www.jianshu.com/p/b1e1214a72cb

上面那个师傅是按照爆破做的,学习了。

Flag:nctf{random_mixed_base64_encode}

第八题:

Python大法好

# coding: utf-8

import hashlib

str1 = 'TASC'

str2 = 'O3RJMV'

str3 = 'WDJKX'

str4 = 'ZM'

for i in range(ord('A'),ord('Z') + 1):

       for j in range(ord('A'),ord('Z') + 1):

              for k in range(ord('A'),ord('Z') + 1):

                     str = str1 + chr(i) + str2 + chr(j) + str3 + chr(k) + str4

                     md5str = hashlib.md5(str.encode("utf-8")).hexdigest()

                     print (str + ' ' + md5str + '\n')

                     if (md5str[0:5]=='e9032'):

                            exit()

然后就成了

其实应该再跑一次数字的,不过字母出了结果,数字就没必要跑了。

Flag:nctf{e9032994dabac08080091151380478a2}

300分到手

第九题:

加密算法看了一下,大概就是:

从一个文件中读取,如果读取不到换行符,就和给定的一个字符数组中的某个数异或,然后再以十六进制输出到另一个文件中。

嗯,好难…

首先我想的就是一个一个试吧…

这个不确定就一个一个试,这个

明文首先是可见的字符吧…所以说可以排除掉几个

上C++,C++大法好…

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <string>

using namespace std;

const int KEY_LENGTH_MAX = 13;

const int KEY_LENGTH_MIN = 1;

int main() {

    FILE *fpIn;

    unsigned char ch;

    string str = "\x00";

    fpIn = fopen("code.txt", "r");

    while (fscanf(fpIn, "%02X", &ch) != EOF) str += ch;

    fclose(fpIn);

    unsigned char ustr[471] = {};

    unsigned char xstr[471] = {};

    int a, b, c, d, e, f, g, h, k, l, m, n, p, i;

    for (i = 0; i < 471; i++) ustr[i] = str[i];

    unsigned char _key[13] = {};

    int KEY_LENGTH = KEY_LENGTH_MAX;

    for (; KEY_LENGTH != 0; KEY_LENGTH--) {

         for (a = 0; a < 256; a++) {

             _key[0] = a;

             for (b = 0; b < 256; b++) {

                  _key[1] = b;

                  for (c = 0; c < 256; c++) {

                      _key[2] = c;

                      for (d = 0; d < 256; d++) {

                          _key[3] = d;

                          for (e = 0; e < 256; e++) {

                               _key[4] = e;

                               for (f = 0; f < 256; f++) {

                                   _key[5] = f;

                                   for (g = 0; g < 256; g++) {

                                       _key[6] = g;

                                       for (h = 0; h < 256; h++) {

                                            _key[7] = h;

                                            for (k = 0; k < 256; k++) {

                                                _key[8] = k;

                                                for (l = 0; l < 256; l++) {

                                                     _key[9] = l;

                                                     for (m = 0; m < 256; m++) {

                                                         _key[10] = m;

                                                         for (n = 0; n < 256; n++) {

                                                             _key[11] = n;

                                                             for (p = 0; p < 256; p++) {

                                                                  _key[12] = p;

                                                                  unsigned char key[13] = {};

                                                                  for (i = 0; i < 13; i++) key[i] = _key[12 - i];

                                                                  for (i = 0; i < 470; i++) xstr[i] = key[i%KEY_LENGTH] ^ ustr[i];

                                                                  cout << "当KEY_LENGTH=" << KEY_LENGTH << ",密码表的遍历为";

                                                                  for (i = 0; i < KEY_LENGTH; i++) printf("%d ", key[i]);

                                                                  cout << "时,字符串解密如下:" << endl;

                                                                  for (i = 0; i < 470; i++) if (xstr[i] >= 32 && xstr[i] <= 127) printf("%c", xstr[i]);

                                                                  cout << endl;

                                                             }

                                                         }

                                                     }

                                                }

                                            }

                                       }

                                   }

                               }

                          }

                      }

                  }

             }

         }

    }

    return 0;

}

这个算法应该理论上是可行的,但是…按照这个算法跑估计跑到我结婚都跑不出来…

自闭了,还是看百度吧…

https://blog.csdn.net/jakekong/article/details/79884365

这篇文章有详细的解答

--------------------------------------------------

真的能跑出来!!!

---------------------------------------------------

学习中…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
\[NCTF2019\]SQLi是一个CTF比赛中的题目,涉及到SQL注入。根据引用\[1\]和引用\[2\]的内容,可以得知在该题目中,通过构造特定的SQL语句,可以绕过过滤,获取到管理员的密码,从而获得flag。具体的解题思路是通过不断尝试不同的字符,构造SQL语句进行盲注,判断是否成功绕过过滤。引用\[3\]提供了一个Python脚本的示例,可以用来自动化进行尝试。该脚本通过构造不同长度的payload,逐位尝试密码的每一位字符,直到获取到完整的密码。 #### 引用[.reference_title] - *1* [[NCTF2019]SQLi --BUUCTF --详解](https://blog.csdn.net/l2872253606/article/details/125265138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [[NCTF2019]SQLi(Regexp注入)](https://blog.csdn.net/weixin_45669205/article/details/116137824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [[NCTF2019]SQLi](https://blog.csdn.net/shinygod/article/details/124100832)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值