Polar 逆向(简单难度)
就当练手,不能因为这是简单题就小看,还是很有收获的!
shell
UPX壳,脱壳,flag直接明文给了
PE结构
拖进010,正常的开头是4D,改回去就能被识别了
看到这部分代码,每个字符^3即可
b='eobdx55:;4bgg30`:;b;e3`b`42f7`be`1b5b~'
a=''
for i in b:a+=chr(ord(i)^3)
print(a)
拼接
也是明文flag
加加减减
加密的时候--,解密就要++
b='ek`fz5123086/ce7ac7/`4a81`6/87b`b28a5|'
a=''
for i in range(0,len(b)):a+=chr(ord(b[i])+1)
print(a)
康师傅
看main函数是^9,也是见过的,直接异或即可
另辟蹊径
一个MFC程序
用CE改即可
use_jadx_open_it
是一个安卓逆向,几乎是明文了
re2
明文不解释
layout
刚开始看dex,是个假的flag。点进去看估计是把好多字符写在一块了
布局助手分析即可
Why32
这里是关键函数,注意这里的half right!题目提示说为什么是32,考虑往哈希角度思考,somd5解密出了
?64
刚开始只解密前8个字节,发现明显缺少,故全部解密
看完WP发现需要md5
Polar靶场reverse方向通关题解-CSDN博客
Sign Up
让找账号密码
第一次没看代码,还需要-1和-2
easyre1
这一题骚包,用指针+大数字代表地址,只需要跳转到地址看对应的数字即可,也不难
cipher='d^XSAozQPU^WOBU[VQOATZSE@AZZVOF' flag='' true='' key=[ 53, 48, 53, 53, 48, 52, 53, 48, 52, 53, 48, 53, 53, 48, 52, 53, 48, 53, 53, 48, 52, 53, 48, 53, 53, 48, 52, 53, 48, 53, 53] for i in cipher:flag+=chr(ord(i)+1) for i in range(0,len(cipher)):true+= chr(ord(flag[i])^key[i]) print(true)
babyRE
是一个C++程序
看样子先调用encode函数,Basic函数暂时没看到作用,然后cin并和encode后的flag比较
这个是encode函数的作用,大概就是对每个字符+=2,iterator应该是迭代器之类,怀疑是和字符迭代有关,可以认为是遍历字符串
现在就是找到解码后的字符串,shift+f12即可
脚本:
cipher='asdfgcvbnmjgtlop'
flag=''
for i in cipher:flag+=chr(ord(i)+2)
print(flag)
C^
代码很明显,只是^1。看了WP知道需要把结果md5加密一下
Polar靶场reverse方向通关题解-CSDN博客
一个flag劈三瓣儿
没啥好说的,也明文给了。
EasyCPP2
估计还是C++
encode也很好懂。和上面的基本换汤不换药
cipher='qisngksofhuivvmg'
flag=''
for i in cipher:flag+=chr((ord(i)+3)^1)
print(flag)
crc
char *__fastcall magic(char *a1)
{unsigned int v1; // eax__int64 v3; // [rsp+10h] [rbp-10h]__int64 v4; // [rsp+10h] [rbp-10h]char *v5; // [rsp+18h] [rbp-8h]v3 = crc32(0LL, 0LL, 0LL);v1 = strlen(a1);v4 = crc32(v3, a1, v1);v5 = (char *)malloc(9uLL);sprintf(v5, "%lx", v4);return v5;
}
这部分是关键,返回crc值
int __fastcall main(int argc, const char **argv, const char **envp)
{const char *v3; // raxconst char *v4; // raxconst char *v5; // raxconst char *v6; // raxconst char *v7; // raxconst char *v8; // raxchar v10[16]; // [rsp+0h] [rbp-30h] BYREFchar input[8]; // [rsp+10h] [rbp-20h] BYREF__int64 v12; // [rsp+18h] [rbp-18h]int v13; // [rsp+20h] [rbp-10h]unsigned __int64 v14; // [rsp+28h] [rbp-8h]v14 = __readfsqword(0x28u);*(_QWORD *)input = 0LL;v12 = 0LL;v13 = 0;scanf("%s", input);strmncpy(input, 0, 4, v10);v3 = (const char *)magic(v10);if ( !strcmp(v3, "d1f4eb9a") ){strmncpy(input, 4, 1, v10);v4 = (const char *)magic(v10);if ( !strcmp(v4, "15d54739") ){strmncpy(input, 5, 4, v10);v5 = (const char *)magic(v10);if ( !strcmp(v5, "540bbb08") ){strmncpy(input, 9, 2, v10);v6 = (const char *)magic(v10);if ( !strcmp(v6, "3fcbd242") ){strmncpy(input, 11, 4, v10);v7 = (const char *)magic(v10);if ( !strcmp(v7, "2479c623") ){strmncpy(input, 15, 1, v10);v8 = (const char *)magic(v10);if ( !strcmp(v8, "fcb6e20c") )printf("Very nice!");}}}}}return 0;
}
通过main函数看出,原flag经过分段crc,输出这么多,我们需要找到对应字符串
写一个对应的python脚本即可!
import zlib
from itertools import product
def cacl_crc(s):'''计算crc'''crc=zlib.crc32(s.encode('utf-8'))&0xffffffff#有符号数字转为无符号return f'{crc:08x}'
# print(cacl_crc('text'))测试用例
# 分段规则:(起始索引, 长度, 目标CRC32)
def brute(target,length,chars):'''target:已知字符串chars:爆破字符集'''for combo in product(chars,repeat=length):candidate=''.join(combo)if cacl_crc(candidate) == target:print(f"找到原文,是{candidate}")return candidatereturn 0
def main():# 常用字符集(可根据题目调整,比如去掉大写字母)# 扩展字符集:包含大小写字母、数字、下划线、连字符、感叹号、问号、括号等常见符号chars = ("abcdefghijklmnopqrstuvwxyz" # 小写字母"ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 大写字母"0123456789" # 数字"_-!@#$%^&*()[]{}<>?.,;:|=+" # 常见符号(根据CTF题目风格调整,去掉可能不相关的)
)result_segments = []segments = [(0, 4, "d1f4eb9a"), # 第1段:从input[0]开始,取4个字符(4, 1, "15d54739"), # 第2段:从input[4]开始,取1个字符(5, 4, "540bbb08"), # 第3段:从input[5]开始,取4个字符(9, 2, "3fcbd242"), # 第4段:从input[9]开始,取2个字符(11, 4, "2479c623"), # 第5段:从input[11]开始,取4个字符(15, 1, "fcb6e20c") # 第6段:从input[15]开始,取1个字符
]for i,(start,length,target) in enumerate(segments,1):print(f"开始爆破第{i}段:长度{length},目标CRC32={target}")segment = brute(target, length, chars)if not segment:return print("none")result_segments.append(segment)full_flag="".join(result_segments)print("结果是:"+full_flag)
if __name__ == "__main__":main()
box
提示说flag就是key连接的结果哦。
看第一段key1:
动调看看cdf的数据!key估计是0B27169,即1694441
key2是that_ok
key3解密后是key
还是参考上个WP,结果还要三者拼接md5
HowTo_Login
先脱壳,进字符串看到有个注册很可疑,所以进来看看,有个v11数组存了估计是password,提取出是CZ9dmq4c8g9G7bAX,tips说要进行md5加密,加密即可
ezpack
aspack脱壳机脱壳,随后注意到就是简单的异或加密,解密即可
cipher='>4i44oo4?i=n>:m;8m4=oo4i;>?4>h9m'
flag=''
for i in cipher:flag+=chr(ord(i)^0xc)
print(flag)
L00k_at_h3r3
Nspack脱壳
int __cdecl main_0(int argc, const char **argv, const char **envp)
{char v4; // [esp+0h] [ebp-190h]size_t ii; // [esp+D0h] [ebp-C0h]size_t n; // [esp+DCh] [ebp-B4h]size_t m; // [esp+E8h] [ebp-A8h]size_t k; // [esp+F4h] [ebp-9Ch]size_t j; // [esp+100h] [ebp-90h]int v10; // [esp+10Ch] [ebp-84h]size_t i; // [esp+118h] [ebp-78h]char input[104]; // [esp+124h] [ebp-6Ch] BYREF__CheckForDebuggerJustMyCode(&word_41C00E);j_memset(input, 0, 0x64u);for ( i = 0; i < j_strlen(Str); ++i )Str[i] ^= 0xAu;puts(aLookAtH3r3S, (char)Str);scanf(aS, (char)input);v10 = 0;for ( j = 0; j < j_strlen(aNqt); ++j ){input[v10] ^= 0xBu;if ( aNqt[j] != input[v10] ){
LABEL_25:puts(aByebye, v4);return 0;}++v10;}for ( k = 0; k < j_strlen(aKixs); ++k ){input[v10] ^= 0xCu;if ( aKixs[k] != input[v10] )goto LABEL_25;++v10;}for ( m = 0; m < j_strlen(aKa9jr); ++m ){input[v10] ^= 0xDu;if ( aKa9jr[m] != input[v10] )goto LABEL_25;++v10;}for ( n = 0; n < j_strlen(aHCq); ++n ){input[v10] ^= 0xEu;if ( aHCq[n] != input[v10] )goto LABEL_25;++v10;}for ( ii = 0; ii < j_strlen(aG); ++ii ){input[v10] ^= 0xFu;if ( aG[ii] != input[v10] )goto LABEL_25;++v10;}puts(aNice, v4);return 0;
}
简单分析是对一个字符串的不同部位异或不同值进行加密,写出解密脚本即可。
cipher='lfkmqw'
flag=''
for i in cipher:flag+=chr(ord(i)^0xa)
cipher1='nqT'
flag1=''
for i in cipher1:flag1+=chr(ord(i)^0xb)
cipher2='kixS'
flag2=''
for i in cipher2:flag2+=chr(ord(i)^0xc)
cipher3='ka9jR'
flag3=''
for i in cipher3:flag3+=chr(ord(i)^0xd)
cipher4='h|>cQ'
flag4=''
for i in cipher4:flag4+=chr(ord(i)^0xe)
cipher5='g<}<'
flag5=''
for i in cipher5:flag5+=chr(ord(i)^0xf)
print(flag+flag1+flag2+flag3+flag4+flag5)
直接交不对,需要md5
解码器
写物理写累了,做到题
明文给了,这个代码实现了encrypt,但是直接说了明文,明文MD5即可