[SWPU2019] Android2
一开始拿到apk直接丢到工具里,结果什么都没有,7zip打开之后才发现,真正的apk还在里面,要解压出来才行
这个flag是假的。
库中提醒重设游戏时间,这时候看到Java源代码
有一个超长的线程延迟和永远为假的判断条件,应该就是要修改这两点。
使用apktool反编译apk之后,直接打开MainActivity.smali文件,找到1000000000
的16进制0x3b9aca00
,只需要修改所有的这个16进制即可,这里修改为0xa
,以及 这里的也要改,这里是内部类里的判断条件
全部改完之后使用apktool重新打包并签名,安装到模拟器里
这样在进入程序就会输出内容了,提示flag是之前的假flag的加密结果
在ida中看到了依赖文件里有md5和decode函数,先用md5试了一下,不正确,那么大致思路就是通过decode函数来逆出encode函数出来将flag{WeLcome_to-SWPU}}
进行加密,先看源代码:
char *__fastcall decode(char *a1, int a2) { int i; // [xsp+10h] [xbp-10h] for ( i = 0; i < (unsigned __int64)strlen(a1); ++i ) { if ( (unsigned __int8)a1[i] < 0x41u || (unsigned __int8)a1[i] > 0x5Au ) { if ( (unsigned __int8)a1[i] >= 0x61u && (unsigned __int8)a1[i] <= 0x7Au ) a1[i] = ((unsigned __int8)a1[i] - 97 + a2) % 26 + 97; } else { a1[i] = ((unsigned __int8)a1[i] - 65 + a2) % 26 + 65; } } return a
不难发现,解密只针对了字母进行加密,符号和数字被排除在外了,而且大写字母只会变成大写字母,小写字母只会变成小写字母,但是有一个a2未知数在捣乱,需要利用26次循坏,每个结果挨个尝试才可以,代码如下:
s = "flag{WeLcome_to-SWPU}}" for x in range(0,26): for v in s: if v >= "A" and v <= "Z": v = chr(((ord(v) - 65) - x)%26 + 65) if v >= "a" and v <= "z": v = chr(((ord(v) - 97) - x)%26 + 97) print(v,end="") print()
得到的结果为:
flag{WeLcome_to-SWPU}} ekzf{VdKbnld_sn-RVOT}} djye{UcJamkc_rm-QUNS}} cixd{TbIzljb_ql-PTMR}} bhwc{SaHykia_pk-OSLQ}} agvb{RzGxjhz_oj-NRKP}} zfua{QyFwigy_ni-MQJO}} yetz{PxEvhfx_mh-LPIN}} xdsy{OwDugew_lg-KOHM}} wcrx{NvCtfdv_kf-JNGL}} vbqw{MuBsecu_je-IMFK}} uapv{LtArdbt_id-HLEJ}} tzou{KsZqcas_hc-GKDI}} synt{JrYpbzr_gb-FJCH}} rxms{IqXoayq_fa-EIBG}} qwlr{HpWnzxp_ez-DHAF}} pvkq{GoVmywo_dy-CGZE}} oujp{FnUlxvn_cx-BFYD}} ntio{EmTkwum_bw-AEXC}} mshn{DlSjvtl_av-ZDWB}} lrgm{CkRiusk_zu-YCVA}} kqfl{BjQhtrj_yt-XBUZ}} jpek{AiPgsqi_xs-WATY}} iodj{ZhOfrph_wr-VZSX}} hnci{YgNeqog_vq-UYRW}} gmbh{XfMdpnf_up-TXQV}}
用flag{}包裹之后挨个提交尝试之后,竟然都不正确!!!!
那么我就将前面的都改成flag,又尝试了一次,还是不对!!!!
最后再删除一个}
符号,终于找到了结果为flag{BjQhtrj_yt-XBUZ}
,由kqfl{BjQhtrj_yt-XBUZ}}
变换而来