当前位置: 首页 > news >正文

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即可

reserve_fib

http://www.dtcms.com/a/513340.html

相关文章:

  • 青岛网站建设比较好做外贸都做哪些网站好免费
  • 做自己的网站有什么用农村自建房设计图120平方二层
  • FITC-PEG-Silane|荧光素-聚乙二醇-硅烷|化学特性与功能
  • MyBatis-Plus-使用
  • 企业网站的常见服务是什么施工企业成立技术中心的好处
  • 软件下载大全网站家里电脑可以做网站空间吗
  • [MySQL] 联合查询
  • 黑客马拉松竞赛中产品成功要素与商业价值实现[特殊字符]
  • 做物流网站的公司网络规划设计师报名
  • 网站项目建设的必要性德国红点设计奖官网
  • 能支持微信公众号的网站建设网站策划的重要性
  • 佛山营销手机网站建设白沟网站开发
  • 复习MySQL
  • 包头网站开发建设电商设计灵感网站
  • 临沂百度网站互联网建站公司
  • 流行的企业网站推广现在注册公司好注册吗
  • 做漂亮的网站dede能建立手机网站吗
  • 文山 网站建设 滇icp网站建设报价单及项目收费明细表
  • wordpress 合并js网站优化方案书
  • .net购物网站开发龙岗做网站公司icxun
  • 一个网站多少钱?清华大学精品课程网站
  • 亚马逊网站联盟gif制作软件app
  • 新加坡房产网站大全天津建设合同怎么在网站录入
  • mysql和tbase语法转换(已亲测)
  • 高端设计网站都有哪些自助设计网站
  • 专业建站公司设计方案无锡网站制作咨询
  • 网站开发的大学生应届简历手机短视频网站的建设
  • 数据结构——广度优先搜索
  • 网站建设教程 作业黄冈黄页
  • 潍城区住房和城乡建设局网站网站怎么做中英文交互