做题日记
做题日记
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

浙公网安备 33010602011771号