REVERSE-PRACTICE-JarvisOJ-3
- 爬楼梯
- 软件密码破解-1
- Classical CrackMe2
- Smali
爬楼梯
apk文件,放到模拟器里运行一下
“爬一层楼”按钮可按,每按一下,“已爬的楼层”加1层
“爬到了,看FLAG”按钮不可按,应该是“已爬的楼层”等于“要爬的楼层”时,按钮可按,获得flag
jadx-gui打开,在com.ctf.test.ctf_100.MainActivity中,静态加载了ctf库
主要的逻辑在onCreate方法中,要爬的楼层设置为随机数,当已爬的楼层大于等于要爬的楼层时,按看flag按钮即可得到flag
程序开头将看flag的按钮设置为不可按,满足条件后设置为可按,考虑patch程序,让程序开头就将看flag的按钮设置为可按
用jeb打开apk,方便找到java语句对应的汇编代码
可以看到,在onCreate方法开始的部分,v5为0,在下面Button->setClickable中作为参数,将看flag按钮设置为不可按,将v5patch为1时,使得看flag按钮在开始时就被设置为可按
ApkToolBox反编译apk,打开CFF_100\smali\com\ctf\test\ctf_100\MainActivity.smali,找到对应位置并修改保存
将整个CFF_100文件夹拖入ApkToolBox回编译,得到一个新的apk
在模拟器中运行,可以看到,看flag按钮可以直接点击获得flag
软件密码破解-1
32位MFC程序,先用xspy查“确定”按钮的id,为0001
再查整个窗口,知道“确定”按钮对应的响应函数为(0x0040)1BB0
ida打开该MFC程序,左侧函数窗搜索1BB0,来到sub_401BB0函数
分析可知,将输入与byte_5777F8数组按下标顺序地做异或运算,结果与已知数据比较,验证输入
byte_5777F8数组的元素在静态分析中不能得到,需要attach程序调试
写逆异或运算脚本即可得到flag
res=[0x1B, 0x1C, 0x17, 0x46,0xF4, 0xFD, 0x20, 0x30,0xB7, 0x0C, 0x8E, 0x7E,0x78,0xDE]
byte_5777F8=[0x28, 0x57, 0x64, 0x6B, 0x93, 0x8F, 0x65, 0x51, 0xE3, 0x53,0xE4, 0x4E, 0x1A, 0xFF]
flag=""
for i in range(len(res)):flag+=chr(res[i]^byte_5777F8[i])
print(flag)
#3Ks-grEaT_j0b!
Classical CrackMe2
exe程序,输入密码,输入错误时还会打印一串base64
查壳,发现是.Net程序,有一句"don’t Unpack with : de4dot",不要使用de4dot解包
用de4dot可以解包,不过解包后的程序不能运行,
dnSpy打开原来的程序,由于没有unpack,会有一些不明白意义的字符,这时可以开另一个dnSpy打开解包过的程序,对照着来看
对照着看,发现按下"GETFLAG"按钮后,来到这个地方进行判断
text是输入,text2是将输入text传入"Wm@@9OrPgw\u0020d/p?i,N>lh@Y!"的一个方法后返回的内容,然后判断 text是否为空以及 text2是否与已知相同
来看调用的"Wm@@9OrPgw\u0020d/p?i,N>lh@Y!“的那个方法,发现是将传入的参数进行AES.ECB模式的加密,名为bytes的数组作为加密密钥Key,密文用base64编码后再返回
调试,可以知道加密密钥Key为"pctf2016pctf2016pctf2016pctf2016”
text2要比较的字符串为"x/nzolo0TTIyrEISd4AP1spCzlhSWJXeNbY81SjPgmk="
写解AES脚本即可得到flag
from Crypto.Cipher import AES
import base64
key="pctf2016pctf2016pctf2016pctf2016"
cipher="x/nzolo0TTIyrEISd4AP1spCzlhSWJXeNbY81SjPgmk="
cipher=base64.b64decode(cipher)
aes=AES.new(key,AES.MODE_ECB)
print(aes.decrypt(cipher))
#PCTF{Dot_Net_UnPack3r_yoo}
Smali
.smali文件,jadx-jui打开
主要逻辑为,使用已知的密钥和密文,解密ECB模式的AES
写解密AES脚本即可得到flag
from Crypto.Cipher import AES
import base64
key="cGhyYWNrICBjdGYgMjAxNg=="
key=base64.b64decode(key)
cipher="sSNnx1UKbYrA1+MOrdtDTA=="
cipher=base64.b64decode(cipher)
aes=AES.new(key,AES.MODE_ECB)
print(aes.decrypt(cipher))
#PCTF{Sm4liRiver}