Reverse
babyre
指定网站:https://snap.berkeley.edu/snap/snap.html
拿到xml,放到指定网站,可以看到源代码,是对一个数组从头到尾进行了异或操作
由于我不会snap,这里手动把数组导出来
102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30
exp:
s = [102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30]
ans = "f"
for i in range(1,len(s)):
s[i] = s[i]^s[i-1]
ans +=chr(s[i])
print(ans)
moveAside
点进去发现汇编全是move,很明显用了混淆器。
尝试用demovfuscator去混淆,无果。
https://github.com/leetonidas/demovfuscator
动调看逻辑是得到结果再用strcmp函数一个个比较,将入口处调用的strcmp改成puts,爆破flag。
先找到跳转的地方,右键选择assemble
找到jmp dword ptr ds:[strcmp_ptr]
和jmp dword ptr ds:[puts_ptr]
对应的字节
在010中找到对应的字节并且修改
将修改后的程序放入虚拟机中,利用脚本进行爆破
from pwn import *
r = process('./moveAside') # 调试时使用本地链接
context(log_level='debug')
# 密文
flag = [0x67, 0x9D, 0x60, 0x66, 0x8A, 0x56, 0x49, 0x50, 0x65, 0x65,
0x60, 0x55, 0x64, 0x5C, 0x65, 0x48, 0x50, 0x51, 0x5C, 0x55,
0x67, 0x51, 0x57, 0x5C, 0x49, 0x67, 0x54, 0x63, 0x5C, 0x54,
0x62, 0x52, 0x56, 0x54, 0x54, 0x50, 0x49, 0x53, 0x52, 0x52,
0x56, 0x8C]
flag1 = ''
index = 0
while True:
for i in range(33, 127):
p = process("./moveAside")
# input your 。。。回显
p.recvline()
# 输入
p.sendline(chr(i).encode())
# 题目中的原样输出
p.recvline()
# 修改的strcmpputs回显
a = p.recvline().decode('ISO-8859-1').strip('\n')
print(flag1)
# 回显可对应密文则加上输入
if index == len(flag):
break
if ord(a) == flag[index]:
index += 1
flag1 += chr(i)
p.close()
print(flag1)
python3 moveaside.py
flag{781dda4e-d910-4f06-8f5b-5c3755182337}
ezbyte
在start函数处发现sub_404D25,点进去发现是输入flag的提示语
sub_404C21给出了flag的前后缀
在虚拟机中查看elf文件的更详细信息
readelf -wf ezbyte
gpt对该指令的解答:
readelf
是一个用于分析 ELF(可执行与可链接格式)文件的命令行工具。ELF 是一种在Unix-like系统中广泛使用的二进制文件格式,用于存储可执行程序、共享库、目标文件等。readelf
命令允许你查看 ELF 文件的各种信息,包括文件头、节头、段头、符号表等。
-w
选项用于显示详细的节和段信息,包括每个节和段的属性、标志、大小等。
-f
选项用于显示文件格式相关信息,比如 ELF 文件的类别、字节顺序、版本等。
因此,readelf -wf
命令的意思是显示 ELF 文件的详细节和段信息以及文件格式相关信息。
得知是dwarf字节码
对搜索出来的字节码过滤,DW_CFA_val_expression
是在调试信息中描述指令序列的一部分,通常用于调试器解释如何计算或修改某个寄存器的值。
readelf -wf ezbyte | grep '^ *DW_CFA_val_expression'
整理得到:
逻辑是先将堆上最外面两个值相加,结果压入堆中,再对堆中所剩元素逐个异或。
以第一个为例,先将r12的值(0)与1892739相加,然后结果对1237891274917891239异或,再将结果对2616514329260088143异或
DW_CFA_val_expression:
r12 (r12) (
DW_OP_constu: 2616514329260088143;
DW_OP_constu: 1237891274917891239;
DW_OP_constu: 1892739;
DW_OP_breg12 (r12): 0;
DW_OP_plus;
DW_OP_xor;
DW_OP_xor;
DW_OP_constu: 8502251781212277489;
DW_OP_constu: 1209847170981118947;
DW_OP_constu: 8971237;
DW_OP_breg13 (r13): 0;
DW_OP_plus;
DW_OP_xor;
DW_OP_xor;
DW_OP_or;
DW_OP_constu: 2451795628338718684;
DW_OP_constu: 1098791727398412397;
DW_OP_constu: 1512312;
DW_OP_breg14 (r14): 0;
DW_OP_plus;
DW_OP_xor;
DW_OP_xor;
DW_OP_or;
DW_OP_constu: 8722213363631027234;
DW_OP_constu: 1890878197237214971;
DW_OP_constu: 9123704;
DW_OP_breg15 (r15): 0;
DW_OP_plus;
DW_OP_xor;
DW_OP_xor;
DW_OP_or)
加上之前得到的前缀和后缀,编写脚本
a = [2616514329260088143,8502251781212277489,2451795628338718684,8722213363631027234]
b = [1237891274917891239,1209847170981118947,1098791727398412397,1890878197237214971]
c = [1892739,8971237,1512312,9123704]
s = []
for i in range(4):
s.append((a[i]^b[i])-c[i])
print(s)
print("flag{",end="")
for i in s:
for j in range(8):
print(chr(i & 0xff),end='')
i = i >> 8
print("3861}")
flag{e609efb5-e70e-4e94-ac69-ac31d96c3861}
ezAndroid
在pri-app文件夹中发现cpeweb.app,放进jadx中查看
cpe是可以接受移动信号转为wifi信号的设备
看了一些wp,说是目录穿越+rce,还没学什么安卓,等学完再回来补这个
flutterror
flutter逆向,不会啊。。。
参考
CTF国赛2023 - ukfc(四道逆向已下班)-优快云博客
CISCN2023 Quals Reverse Writeup - gaoyucan - 博客园 (cnblogs.com)
2023 CISCN 初赛 Writeup By Xp0int - Xp0int
0917746)
CISCN2023 Quals Reverse Writeup - gaoyucan - 博客园 (cnblogs.com)