Junkcode:

32位,这题考的是花指令,其实看一下汇编就知道这题大概思路了

找到花指令,这类东西我以后会专门进行讲解

这里也简单说一下这段汇编的分析,jz就是判断为1就跳转,红色地址是一个很远的无效的,这会干扰我们或者AI进行分析真正的加密函数,而且IDA这个静态分析的,可能导致后面解析错位

那么就去花,选中内存地址00411AC4,按U键进行undefine

弄过之后

继续,选中00411AC5处按C键MakeCode,再将00411AC4处的字节内容改为0x90。其实相当于NOP,选中右键,按照一下步骤

再选中地址为00411AC5处按C键MakeCode

最后回到main函数按P构造函数,就是这个样子

这样就可以进行反编译了,至于为什么要这样我会在以后的博客中细讲

一个简单的异或操作

str = "dnceyhwli]amfg]kq]dwll{"
flag = " "
for i in range(len(str)):
    flag += chr(ord(str[i])^2)
str1 = chr(127^2)
flag += str1
print(flag)

RevMethod:

32位,打开字符串有很多flag,打开一下解密算法

分析一下,前面是随机生成100个flag,第24、25行是输入flag,第26行后是判断flag真假

if判断的是flag前7个字符是否与地址对应,但是可以发现前五个地址相差很远,说明前五个是一样的,那就看第6,7个字节对应的地址

根据2566可知flag第7个内存地址的位置41A000+A06,找到就行了

逆一下子:

32位,进入主函数,但是一时半会找不到主函数

在sub_401180里找到了类似flag

把中间连接号去掉就好了,其实这道题简单的可以直接用Resource Hacker写,大概就像下面这道题

可以为师:

运行程序,发现帮助打不开,放到Resource Hacker中改一下INACTIVE(删除)就可以打开了

再点开就行了

左右为难:

看这题目像迷宫题,话说已经好久没写过迷宫题了,有点意思

32位,进入main函数

先是一段字符给v7,dword_41D2C8 和 unk_41D2CC 分别表示玩家的 X/Y 坐标,然后循环读取输入的字符,wasd分别表示上移左移下移右移

第42行说明了这是一个16*16的迷宫表,根据初始X/Y为(1,1),那么@是起点,不能走0,$是结束。那么就根据迷宫表写出路径

最后32位MD5加密即可

混淆code?:

64位,进入main函数

这个重点就是第11行后的for循环,如果j是奇数,那么flag[100*j + i] = i + 98;如果j是偶数,flag[100*j + i] = j + 97,这个逻辑很麻烦,初始矩阵

但是其实我们可以交叉引用一下,发现引用flag的就这一个函数,它只是在这里定义了一个flag诱导一下,其实没啥用

重点是check函数,这里解释一下*((_BYTE *)v3+i,定义 v3 为 _WORD v3[8],v3是指向16位数组的指针,强制转换为BYTE指向8位数组的指针,每次循环从v3其实位置偏移i个字节,再解引用得到相应的值

这个函数其实是将v3和str进行比对

还有X函数,这是个异或,但是要注意字符串最后一个事不异或的,也就是!

i和j其实是相等的,但是双击j,发现j的初始值

是8,也就是说异或的是数组下标+8

代码:

str = "`lfgc-y`b}v!"
flag = ""
for i in range(len(str)-1):
    flag += chr(ord(str[i]) ^ (i+8))
flag += "!"
print(flag)

Java_Tools:

改后缀为apk,用jadx打开,进入main函数

j前面给的是6,x的值在前面函数名那里是3

并且根据函数顺序,这个算法逆向就是将字符串反转再ASCLL码-3,但是这个转换中间俩没有反转

代码:

s = list("$gourZroohK")      # 转 list 才能交换
n = len(s)

# 错误的翻转函数(CTF 同款)
for i in range(n // 2 - 1):
    temp = s[i]
    s[i] = s[n - 1 - i]
    s[n - 1 - i] = temp

# 再执行 -3(Add_1 的逆操作)
flag = ""
for c in s:
    flag += chr(ord(c) - 3)

print(flag)

PY_RE:

两个代码,start.py

print前是建立了一个字典映射关系,这个在我之前讲置换的时候提到过。A-Z对应26-1,main函数就是进行加密和验证

text.py

Endata1是将字符串的后半部分替换为对应字典中的值,Judge是将处理后的值与FLAG是否相等

Endata是把输入字符串后半部分对应字典中的值存入全局列表all_data,这个其实没啥用

那么就很简单了,就是把对应后的值返回字符串HELLO__PYTHON再MD5加密即可

二层防御:

64位,UPX脱壳,进入main函数

Check_Length检查字符串长度,Strlen没有什么实际效果,check检查加密后的字符串和flag1是否相等,跟进flag1的值

sub122是加密函数,跟进

这是将str字符串进行反转,而且i从1开始,就是第一个和最后一个不变,跟进sub133

将每一位的ASCLL码-1与x1异或,v1的初始值为1,且到x-1停止,那么跟上面的一样都是第一个和最后一个不变,跟进j

x1=j是8

那么就逆向写代码

flag1 = 'allo_PWN n'
for i in range(len(flag1)):
    flag1 += chr((ord(flag1[i]) + 1) ^ 8)
 
print(flag1)

这是全部异或,部分异或并反转就是aeexhYPG)n——>a)GPYhxeen,最后MD5即可

猜猜我在哪:

64位,进入main函数

会随机生成一个0-4的key,对input进行加密,把加密后的字符串中的o改为0,最后比较

跟进encrypt函数

这是经典的凯撒加密,跟着加密代码来写就可以,或者直接用工具就行了,偏移量0-4之间

记住解密要先把0改为o(逆向反过来)

易位:

32位,进入main函数。没发现啥有用的地方

不会写,参考官方讲解视频,竟然是两个自定义的函数san、yi

这俩都是对字符串进行易位操作

分别运行一下,可以在运行前让AI给修改成可以正常运行的

都是乱码,但是可以尝试这俩的数值交换一下比如for循环中-8跟-15互换,再分别运行

这不就对了嘛,拼一块MD5加密,有的网站加密是错的

EasyGo:

64位,进入main函数,这看不懂,好像还有花指令。还是看官方吧

重点是main_encode函数

这个花指令没啥影响NOP不NOP都行,看for循环,将输入的字符串每个字符ASCLL码+2,再与3异或

看main_array数组获取密文,跟进offset unk_5185A0

shift + e提取,这个逆向一下发现不对,那就正着解一遍就行了

str = "jiqnnkssghwikjhg"
flag = ""
for i in range(len(str)):
    flag += chr((ord(str[i])+2)^3)
print(flag)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐