做题日记

做题日记

2.17

RE-xor

IDA分析后简单的异或过程,找到明文直接写脚本即可

Web-[HCTF 2018]WarmUp

cd 命令其实后面是可以随便接一个文件然后往上级目录跳的

例如: cd 114514.1919810/../../../../ 跳到根目录

Web-[MRCTF2020]你传你🐎呢

编写.htaccess文件

AddType application/x-httpd-php .png

即可将png解析为php

这时候上传后缀为png的shell即可

RE-reverse3

源码中找到一个很复杂的加密函数,合理推测是一种很常见的加密,不然难度过大,搜索后为base64加密,逆向解密即可

RE-不一样的flag

分析源码,up\down\left\right很像一个迷宫游戏,进而找到一个0\1串和一些关键判断,推断迷宫解法即为flag

2-18

Web-BUU BURP COURSE 1

简单题。考察一些基础的文件头

Web-[极客大挑战 2019]Http

同上

Web-[BJDCTF2020]Mark loves cat

首先利用git漏洞找到源代码,分析后发现其中有一句

foreach($_GET as $x => $y){
    $$x = $$y;
}

很明显的变量覆盖漏洞

根据下面的判断条件构造$yds=$flag就行了

Web-[BJDCTF2020]ZJCTF,不过如此

根据源码,分别利用php://filter伪协议和data://text/plain伪协议得到next.php的源代码

然后

RE-简单注册器

apk逆向,分析后直接找个自己熟悉的语言运行一下加密程序就有了

RE-刮开有奖

先把伪代码写成c代码运行一下

#include<bits/stdc++.h>
using namespace std;
int sub_4010F0(char *a1, int a2, int a3)
{
  int result; // eax
  int i; // esi
  int v5; // ecx
  int v6; // edx
  result = a3;
  for ( i = a2; i <= a3; a2 = i )
  {
    v5 = i;
    v6 = a1[i];
    if ( a2 < result && i < result )
    {
      do
      {
        if ( v6 > a1[result])
        {
          if ( i >= result )
            break;
          ++i;
        	a1[v5] = a1[result];
          if ( i >= result )
            break;
          while (a1[i] <= v6 )
          {
            if ( ++i >= result )
              goto LABEL_13;
          }
          if ( i >= result )
            break;
          v5 = i;
          a1[result] = a1[i];
        }
        --result;
      }
      while ( i < result );
    }
LABEL_13:
    a1[result] = v6;
    sub_4010F0(a1, a2, i - 1);
    result = a3;
    ++i;
  }
  return result;
}
int main(){
	char enc[] = "ZJSECaNH3ng";
	sub_4010F0(enc, 0, 10);
	cout << enc; 
	return 0;
}
//3CEHJNSZagn

得到加密的密文为3CEHJNSZagn

sub_401000函数很复杂,推测为常见加密,这里是base64加密

阅读最后一部分判断

    if ( String[0] == v7[0] + 34
        && String[1] == v10
        && 4 * String[2] - 141 == 3 * v8
        && String[3] / 4 == 2 * (v13 / 9)
        && !strcmp(v4, "ak1w")
        && !strcmp(v5, "V1Ax") )

第一位 (char)('3'+34)=U

第二位J

第三位(char)(('E'*3+141)/4)=W

第四位(char)(8*('Z'/9))=P

ak1w解密为jMp

V1Ax解密为WP1

根据长度为8拼接得flag为UJWP1jMp

RE-[GXYCTF2019]luck_guy

第一部分flag在明文里,第二部分需要读源代码,看懂之后写就好了

enc=[0x7f,0x66,0x6F,0x60,0x67,0x75,0x63,0x69]
enc.reverse()#大小端序问题
flag = ""
for i in range(0, 8):
    if (i%2 == 1): flag += chr(enc[i]-2)
    else: flag += chr(enc[i]-1)
print(flag)

RE-SimpleRev

蛮难的其实

将key和text拼接好

暴力枚举flag就好了(因为string下标从0开始不习惯所以调了好久)

#include<bits/stdc++.h>
using namespace std;
int main() {
	string text = "killshadow";//len=10
	string key = "ADSFKNDCLS";
	string flag = "";
	string str2;
	int v3=0, v2=0, v5=key.length();
	for (int i = 0; i < v5; ++i ) {
		if ( key[v3 % v5] >= 'A' && key[v3 % v5] <= 'Z' )
			key[i] = key[v3 % v5] + 32;
		++v3;
	}
	cout << key << " " << v3 <<" " << v5 << endl;
	for(int i=0; i<=9; ++i) {
		for(int j=0; j<=57; ++j) {
			int v1 = (int)('A'+j);
			str2[v2] = (char)((v1 - 39 - key[v3 % v5] + 97) % 26 + 97);
			if(str2[v2]==text[i]) {
				//printf("OK! %d\n", ((v1 - 39 - key[v3 % v5] + 97) % 26 + 97));
				//cout << (char)('A'+j) << " " << (char)((v1 - 39 - key[v3 % v5] + 97) % 26 + 97) << endl;
				flag += v1;
				break;
			}
		}
		++v3;
		++v2;
	}
	cout << flag;
	return 0;
}
//3CEHJNSZagn
posted @ 2024-02-17 21:47  Liooooo  阅读(17)  评论(0编辑  收藏  举报