2023ciscn初赛reverse wp

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(四道逆向已下班)-CSDN博客

CISCN2023 Quals Reverse Writeup - gaoyucan - 博客园 (cnblogs.com)

2023 CISCN 初赛 Writeup By Xp0int - Xp0int
0917746)

CISCN2023 Quals Reverse Writeup - gaoyucan - 博客园 (cnblogs.com)

2023 CISCN 初赛 Writeup By Xp0int - Xp0int

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值