RE入门第四天---做新手题
题目来自polarDN
wp来自:
PolarCTF靶场Reverse方向简单难度Writeup - 这里是千夏 (l0serqianxia.github.io)
polar靶场reverse区简单难度题目详解 - 先知社区 (aliyun.com)
shell
考查:UPX自动脱壳
下载下来
ida打开
有壳的体现
尝试自动脱壳
D:\..CTFgoju\reverse\UPX\upx-4.2.4-win64\upx-4.2.4-win64
脱壳成功
ida打开,找到main主函数
flag{crack_is_funny}
PE结构
考查:PE文件结构
根据题目描述
010看看文件格式
果然有错误
将WZ改为MZ
运行得到flag
flag{66987add03c98a8f0cac71e4cafc2a6a}
拼接
一个白文件,名字为zip
拖进010一看,
看到PK
确定是zip
改后缀,
ida打开,看见两段flag
拼接得到flag
flag{03ff6cf238c5cd8e7b4ee1e9567ad5a4}
加加减减
改zip后缀,ida打开
可以看到将密文的每一位减了1,逆过来就OK
enc = 'ek`fz5123086/ce7ac7/`4a81`6/87b`b28a5|'
str = ''
for i in enc:
str += chr(ord(i)+1)
print(str)
# flag{62341970df8bd80a5b92a7098cac39b6}
康师傅
还是改zip后缀
ida打开
进入main函数
看到
int __cdecl main_0(int argc, const char **argv, const char **envp)
{
int v3; // edx
int v5; // [esp-4h] [ebp-158h]
unsigned int i; // [esp+D0h] [ebp-84h]
char v7[60]; // [esp+DCh] [ebp-78h] BYREF
char v8[43]; // [esp+118h] [ebp-3Ch] BYREF
int v9; // [esp+143h] [ebp-11h]
__int16 v10; // [esp+147h] [ebp-Dh]
char v11; // [esp+149h] [ebp-Bh]
int v12; // [esp+150h] [ebp-4h]
int savedregs; // [esp+154h] [ebp+0h] BYREF
sub_459319(&unk_53B006);
strcpy(v8, "oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t");
*(_DWORD *)&v8[39] = 0;
v9 = 0;
v10 = 0;
v11 = 0;
sub_457EB0(v7, 0, 50);
((void (__cdecl *)(_DWORD))sub_45748D)(&unk_510E84);
sub_457929(&unk_510E50, (char)v7);
for ( i = 0; i < sub_457672(v7); ++i )
v7[i] ^= 9u;
if ( sub_459512(v8, v7) )
((void (__cdecl *)(_DWORD))sub_45748D)("error");
else
((void (__cdecl *)(_DWORD))sub_45748D)("right");
sub_45957B(&savedregs, &dword_45E57C, 0, v3);
return sub_4593E1((unsigned int)&savedregs ^ v12, v5);
}
密文的加密逻辑是异或9u
写脚本逆过来
但是脚本是异或9还是9u还是u喃
都试试看
enc = 'oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t'
str = ''
for i in enc:
str += chr(ord(i)^9)
print(str)
#flag{17625630b7902ac99f735f61ea21a0e2}
最后试了异或9,不知道为什么
键位命令补充
按R键9u变成\t,按H键\t变9u
flag{17625630b7902ac99f735f61ea21a0e2}
×另辟蹊径
需要点击10000次,这种小游戏题最坏的解决方法是通关,
多的情况还是逆
OK学新东西
【原创】CE教程:基础篇 - 『软件调试区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
[CE修改器使用教程 基础篇] - lyshark - 博客园 (cnblogs.com)
不知道为什么CE进程老是出问题,不管了这题先放一下
flag{60983973c2ab87436914d71000e4b4e4}
use_jadx_open_it
一个apk软件
根据名字,用jadx打开apk软件
jadx下载地址
jadx反编译—下载和使用(傻瓜教程,非常详细)_jadx使用教程-CSDN博客
Release 1.5.0 · skylot/jadx · GitHub
源代码中找到flag
re2
ida打开main函数找到flag
flag{e10adc3949ba59abbe56e057f20f883e}
layout
jadx打开apk文件,发现flag,但是不对
文件名字为layout
在资源文件中找到
在main函数中找到flag
flag{andoird_re}
Why32
int __fastcall main(int argc, const char **argv, const char **envp)
{
_main(argc, argv, envp);
Start();
return 0;
}
看见两个关键函数,一个个分析看
进入Start()
看到错误输入,说明else的Do函数才是重要的
int Do(void)
{
int result; // eax
char v1[40]; // [rsp+20h] [rbp-30h] BYREF
int v2; // [rsp+48h] [rbp-8h]
int i; // [rsp+4Ch] [rbp-4h]
strcpy(v1, "2gfe8c8c4cde574f7:c6c;:;3;7;2gf:");
result = 993475379;
v1[33] = 0;
v2 = 0;
for ( i = 0; i <= 31; ++i )
{
result = v1[i] - 2;
if ( str[i] != result )
{
result = puts("you are wrong");
v2 = 1;
break;
}
}
if ( !v2 )
return puts("Half right,think more");
return result;
这里输入成功返回的是字符创减2的效果,能用逆,直接脚本完事
flag="2gfe8c8c4cde574f7:c6c;:;3;7;2gf:"
for i in flag:
print(chr(ord(i)-2),end="")
#0edc6a6a2abc352d58a4a98919590ed8
但是这个还不是flag
MD5解密看看
flag{F1laig}
?64
不要忘记运行
运行得到base64
ZmxBZ19pc2hlUmU=
flAg_isheRe
MD5加密
flag{5d15777a411724ee5d029caca1ca7298}
Sign Up
【2023秋季个人挑战赛】 找到正确的账号和密码 拼接起来MD5即是正确答案。 例如 账号123 密码 root 答案 : flag{md5(123root)}
ida打开,进入main函数
int __fastcall main(int argc, const char **argv, const char **envp)
{
_main(argc, argv, envp);
Input_Data();
Check_Data();
return 0;
}
进入Input_Data
int Input_Data(void)
{
puts("请输入账号和密码:");
gets((__int64)num);
gets((__int64)password);
puts(num);
return puts(password);
}
进入int Check_Data(void)
int Check_Data(void)
{
int j; // [rsp+20h] [rbp-10h]
int i; // [rsp+24h] [rbp-Ch]
int v3; // [rsp+28h] [rbp-8h]
int v4; // [rsp+2Ch] [rbp-4h]
v4 = 1;
v3 = 1;
for ( i = 0; i <= 6; ++i )
{
if ( num[i] + 1 != key_num[i] )
v4 = 0;
}
for ( j = 0; j <= 3; ++j )
{
if ( password[j] + 2 != key_password[j] )
v3 = 0;
}
if ( !v4 && !v3 )
return puts("账号密码错误:");
if ( !v4 )
return puts("账号错误:");
if ( v3 )
return printf("密码正确!");
return puts("密码错误:");
}
OK,input的数值在哪里
直接进入input找
点击password交叉引用看看在哪里
找到账号密码
192168109
root
现在分析check函数
在Input_Data函数输入num和password,在Check_Data函数如果想输出"密码正确!",需要同时满足v3 = 1
和v4 = 1
num为key_num每一位ascll码减1,password为key_password每一位ascll码减2
这里要注意mun遍历的是前7位,最后2位没有遍历,所以不需要改变
key_num = '1921681'
key_password = 'root'
num = ''.join(chr(ord(i)-1) for i in key_num)
password = ''.join(chr(ord(j)-2) for j in key_password)
print(num,'09',password,sep='')
# 081057009pmmr
MD5加密得到
flag{aa07caa2ff9e5b774bfca3b1f20c3ea0}
easyre1
int __cdecl main(int argc, const char **argv, const char **envp)
{
__isoc99_scanf("%s", &flag);
enkey();
reduce();
check();
return 0;
}
1
int enkey()
{
int i; // [esp+Ch] [ebp-4h]
for ( i = 0; i <= 31; ++i )
*(_BYTE *)(i + 134520992) ^= *(_BYTE *)(i + 134520896);
return 0;
}
2
int reduce()
{
int i; // [esp+Ch] [ebp-Ch]
for ( i = 0; i <= 30; ++i )
--*(_BYTE *)(i + 134520992);
putchar(10);
return 0;
}
3
int check()
{
if ( !strcmp(&flag, "d^XSAozQPU^WOBU[VQOATZSE@AZZVOF") )
return puts("you are right");
else
return puts("no no no");
}
代码逻辑就是密文和key异或,然后自身减了1
(目前判断先后顺序就是从上往下)
脚本解密
enc = 'd^XSAozQPU^WOBU[VQOATZSE@AZZVOF'
key = '5055045045055045055045055045055'
flag=''
for i,j in zip(enc,key):
i = ord(i) + 1
flag += chr(i ^ ord(j))
print(flag)
# PolarDNbecomesbiggerandstronger
flag{PolarDNbecomesbiggerandstronger}
×babyRE
这题没有看懂wp,
乱七八糟的,现在是入门不管这些
反正就是密文+2=flag
flag = "asdfgcvbnmjgtlop"
flag_ = ""
for i in range(len(flag)):
flag_ += chr(ord(flag[i]) + 2)
print(flag_)
#cufhiexdpolivnqr
flag{cufhiexdpolivnqr}
32位ida打开
// bad sp value at call has been detected, the output may be wrong!
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [esp-Ah] [ebp-60h]
int v5; // [esp-6h] [ebp-5Ch]
_BYTE v6[48]; // [esp-2h] [ebp-58h] BYREF
int v7; // [esp+2Eh] [ebp-28h]
size_t v8; // [esp+32h] [ebp-24h]
int v9; // [esp+36h] [ebp-20h]
int v10; // [esp+3Ah] [ebp-1Ch]
int *v11; // [esp+4Ah] [ebp-Ch]
v11 = &argc;
init();
*(_DWORD *)&v6[2] = 0;
v7 = 0;
memset(&v6[4], 0, 4 * (((&v6[2] - &v6[4] + 50) & 0xFFFFFFFC) >> 2));
v10 = 0;
v9 = 0;
puts("Please enter flag\n");
((void (__stdcall *)(const char *, _BYTE *, int, int, _DWORD))__isoc99_scanf)("%s", &v6[2], v4, v5, *(_DWORD *)v6);
v8 = strlen(&v6[2]);
fun1(&v6[2], v8);
if ( check(&v6[2], v8) )
puts("RIGHT");
else
printf("Try again");
return 0;
}
进入fun1
将i+a1看作一个整体
int __cdecl fun1(int a1, int a2)
{
int i; // [esp+Ch] [ebp-4h]
for ( i = 0; i < a2; ++i )
*(_BYTE *)(i + a1) ^= 1u;
return 0;
}
int __cdecl check(int a1, int a2)
{
char s[12]; // [esp+8h] [ebp-20h] BYREF
int v4; // [esp+14h] [ebp-14h]
int v5; // [esp+18h] [ebp-10h]
int i; // [esp+1Ch] [ebp-Ch]
strcpy(s, "shfiu777");
v4 = 0;
v5 = 0;
if ( strlen(s) != a2 )
return 0;
for ( i = 0; i < a2; ++i )
{
if ( *(_BYTE *)(i + a1) != s[i] )
return 0;
}
return 1;
}
就是密文异或1=返回right,就是flag
enc = 'shfiu777'
flag = ''
for i in enc:
flag += chr(ord(i)^1)
print(flag)
# right666
MD5加密
flag{f9239748ca798af5d838ac8699bb5d3d}
一个flag劈三瓣儿
ida打开拼接flag即可
int flag()
{
printf("flag{HaiZI233");
printf("N145wuD!");
return printf("le112@666}");
#flag{HaiZI233N145wuD!le112@666}
EasyCPP2
找到加密函数
__int64 encode(void)
{
__int64 result; // rax
int i; // [rsp+0h] [rbp-4h]
for ( i = 0; i <= 15; ++i )
{
flag[i] += 3;
result = i;
flag[i] ^= 1u;
}
return result;
OK
shift+F12找到可疑密文
qisngksofhuivvmg
的确是
还是密文+3在异或1得到flag
flag = list("qisngksofhuivvmg")
for i in range(len(flag)):
flag[i] = chr(ord(flag[i]) + 3)
flag[i] = chr(ord(flag[i]) ^ 1)
print("".join(flag))
#umwpkowshjymxxqk
flag{umwpkowshjymxxqk}
crc
好多串16进制代码
根据名字看是不是crc32爆破
就是将v11中从索引为0之后的4位字符crc32加密与d1f4eb9
a比较
就是将v11中从索引为4之后的1位字符crc32与15d54739比较
from binascii import crc32
for i in range(128):
for j in range(128):
for k in range(128):
for l in range(128):
string=chr(i) + chr(j) + chr(k) + chr(l)
if crc32(string.encode()) == 0xd1f4eb9a:
print(string)
#flag
from binascii import crc32
for i in range(128):
if crc32(chr(i).encode()) == 0x15d54739:
print(chr(i))
# {
得到flag{
可以得出就是crc32爆破
from binascii import crc32
for i in range(128):
for j in range(128):
for k in range(128):
for l in range(128):
string=chr(i) + chr(j) + chr(k) + chr(l)
if crc32(string.encode()) == 0xd1f4eb9a:
print(string)
#flag
for i in range(128):
if crc32(chr(i).encode()) == 0x15d54739:
print(chr(i))
# {
for i in range(128):
for j in range(128):
for k in range(128):
for l in range(128):
string=chr(i) + chr(j) + chr(k) + chr(l)
if crc32(string.encode()) == 0x540bbb08:
print(string)
for i in range(128):
for j in range(128):
string=chr(i) + chr(j)
if crc32(string.encode()) == 0x3fcbd242:
print(string)
for i in range(128):
for j in range(128):
for k in range(128):
for l in range(128):
string=chr(i) + chr(j) + chr(k) + chr(l)
if crc32(string.encode()) == 0x2479c623:
print(string)
for i in range(128):
string = chr(i)
if crc32(string.encode()) == 0xfcb6e20c:
print(string)
"""
flag
{
ezre
by
zhsh
}
"""
import binascii
import string
chars = string.printable
def crc4(target):
for a in chars:
for b in chars:
for c in chars:
for d in chars:
str1 = a + b + c + d
if(target == "{:0>8s}".format("%x"%(binascii.crc32(str1.encode("utf-8")) & 0xffffffff))):
print(str1)
return
def crc1(target):
for a in chars:
str1 = a
if(target == "{:0>8s}".format("%x"%(binascii.crc32(str1.encode("utf-8")) & 0xffffffff))):
print(str1)
return
def crc2(target):
for a in chars:
for b in chars:
str1 = a + b
if(target == "{:0>8s}".format("%x"%(binascii.crc32(str1.encode("utf-8")) & 0xffffffff))):
print(str1)
return
crc4("d1f4eb9a")
crc1("15d54739")
crc4("540bbb08")
crc2("3fcbd242")
crc4("2479c623")
crc1("fcb6e20c")
flag{ezrebyzhsh}
代码解释
如果没有.encode()
会出现
结语
OK,polarDN平台现有的revesre的简单题ak了,不管是看wp还是啥,想达到的效果达到了。
虽然解了10多题,花费了将近3小时,但是事实是没有一点进步,都是一些基础了不能再基础的知识,但是也不是没有作用,只不过作用少。
RE未来学习
1.还是得看课学习,练习相应知识点的题目,巩固,总结,提升
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南