checkyourkey
主要代码逻辑保存在libCheckYourKey.so
1 | if (MainActivity.ooxx(content)) { |
加密主要逻辑如下
最后会和一段数据比较,但是数据存在异常,非正常base64加密数据。
我们找到init_array,如下这段完成了对一大段数据的解密
通过脚本还原数据得到如下,因为手机坏了这次没有动调emm,主要是利用数组指针,然后直接执行获得内容
得到内容如下,猜测有检测frida
解密得到aes后的数据
然后aes解密
1 | from Crypto.Cipher import AES |
rttt
这里存在rc4特征
rc4的秘钥通过异或生成,得到为Welc0me to RCTF 2O22
然后rc4函数之后出现了一段大小为15的数组,解密出来为Congratulations
解密rc4,很明显顺序不太对
1 | from Crypto.Cipher import ARC4 |
回到xor的地方,构造密文得到置换表
获取输入–>置换–>rc4
1 | s1 = 'qwertyuiopasdfghjklzxcvbnm1234567890QWERTY' |
1 | from Crypto.Cipher import ARC4 |
huowang
非预期的题,第一个迷宫走完然后爆破即可,这里就记一下学习笔记。
unicorn
uc_open(uc_arch arch, uc_mode mode, uc_engine **result)
UC_ARCH_X86, // X86 architecture (including x86 & x86-64)
UC_MODE_64 = 1 << 3, // 64-bit mode
uc_mem_map
uc_mem_write
uc_hook_add
uc_emu_start
uc_close
看似hook了一个奇怪的指令
动态修改后,更改为了syscall,然后对syscall的调用进行处理
设置硬件断点可以发现实在第二段模拟中修改了dword_18D73E0,
从而修改if中的第二个值
然后跳转到了
观察syscall,每一轮syscall都会进行一轮异或,也就是smc自解密代码
配合hook回调函数,可以看出第一个函数为uc_reg_read_batch函数,把7个寄存器的值读入到了qword中,然后在进行判断是sys_write还是sys_exit
第一段代码模拟为0x145e0a9–>0x145E0FA
第二段代码执行
1 | .rodata:000000000145E0C2 mov r10d, 0 |
有一点点迹象,如下
留坑:
这个师傅写了一个脚本,通过修改代码在迷宫上执行dfs,使用pwntools的disasm来获得新的xor-key。后续写好了会补上来
picstore
还原字节码
修改了字节码加载,修改lua-5.3.3的逻辑后即可获取到字节码
1 | luadec -dis picStore.bin > out.txt |
在load的时候修改了字节码,但是在dump的时候没有修改字节码
自编译luadec,可以得到结果如下
1 | ; Disassembled using luadec 2.2 rev: UNKNOWN for Lua 5.3 from https://github.com/viruscamp/luadec |
第二种方法,先通过opcode还原写成正常的字节码
https://bbs.pediy.com/thread-275620.htm#msg_header_h3_5
1 | import gdb |
写fix_picstore.bin
1 | import struct |
然后使用unluac还原
1 | java -jar ./unluac.jar ./fix_picStore.bin > ./oplua.lua |
得到源码后分析发现,进入check_func函数
在该函数中发现了关键函数标志
1 | a_AHy3JniQH4 |
klee求解
通过a_AHy3JniQH4
找到对应ida中对应的函数chk_23
看一下ida中代码实现,利用klee进行还原input
https://github.com/Pusty/writeups/blob/master/RCTF2022/kleeMe.c
先生成字节码,然后再执行klee
1 | clang-11 -I klee/include -emit-llvm -c kleeMe.c && ~/klee_deps/klee_build110stp_z3/bin/klee kleeMe.bc |
1 | ktest file : 'test000001.ktest' |
脚本原理
对于所有abs方程,都假设为0
1 |
|
可以得到结果
1 | ktest file : 'test000001.ktest' |
继续分析lua,可以提取出字节表L3_2
会利用该表进行操作如下
1 | for L7_2 = L4_2, L5_2, L6_2 do |
相当于一个置换表,脚本如下
1 | byteTable = "69f43f0a18a9f86b818a19b660b00e5938e5ce13171516c6b3a798421cc9d550a29766245b253211aa29035455e283264720128e462770dc10db9fde0b7763cb2f94b9375d30997101ed234b439ba14a6c4cb5e9ba2c7de858085fa3c8f978f3aed4fcea3a65e4566d90687975570f840c14a573888776454402527bfafb35ff33ddd3c3918cfe00742b1dd9c5b7a8bc22da92936295f6b4672128cfd0c08f1a9ae1648daf7ce63eb1cd6ecafdad2e3472a4a6899e7a0d53b285bdbb07b84df5d8bec2489dacabc7a02d311bcc51065c3bd1ef82613dd6d7495a7e2a1ef04fe04edf6f3c0405c4e76a408beb96e3eebf7f1f9c36f1f286f780415e39d2ec09c1" |
tips
abs32
函数在算法上与y = x >> 31; (x^y)-y
相等。
https://hackmd.io/@94y7q597ST2hNdB9lbTJhA/S1wJr4Bds
https://blog.csdn.net/qq_41866334/article/details/128302662
https://blog.wm-team.cn/index.php/archives/35/
https://www.cnblogs.com/xyqer/articles/16454030.html