n1cef1sh's Blog

re1 file

main函数如下 flllag和sttr_home字符串都是明显可见的,进行异或后得到一组数据,将得到的数据写入文件,求得该文件的md5即flag。当时理解错了题意,以为求出来的字符串应该是类似md5格式的字母和数字,但是求出来的有乱码,就莫名其妙去看encode函数了,其实都没用到encode。

fllg = 'flag{hello_player_come_on_hahah}'
key = []
sttr = '664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643'
st = []
for i in range(0,len(sttr),2):
	b = sttr[i:i+2]
	st.append(int(b,16))
print st

flag = []
for i in range(len(fllg)):
	for j in range(256):
		if i^j^st[i] == ord(fllg[i]):
			key.append(chr(j))
			#print hex(j)
			flag.append(hex(j))
print key
print flag

把求出来的数据写到新建的空白文件里 运行验证一下 所以最后文件的md5就是flag

flag{914A7B9DF69EAB5B74B9EDB7070E53E8}

re2 Run

说实话当时没外网的时候也没报这个警告=。= 带upx壳,有smc和混淆,待补充

babyloginplus

vm逆向,待补充

Android部分

sign_in

逻辑很简单,输入的flag要和getFlag()返回的字符串逆转后再base64解码后的字符串相同。而getFlag()返回值是

我们去R这个资源文件里搜索一下这个ID 2131427360

于是我们知道了这个变量的名字是toString。 解压apk,在/res/values/strings.xml资源文件里搜索它

处理后得到flag

flag{Her3_i5_y0ur_f1ag_39fbc_}

fake_func

java层没有东西,直接来到checkso.so看加密过程。

导出表里找到checkflag函数,同时注意到有inlineHook等hook操作存在。

获取输入的字符串,经过一个sub_E08()函数之后,和off_6004这个固定字符串进行比较。而sub_E08是把off_ 6004这个字符串以及它的长度作为两个参数传入sub_ 16D8()进行处理,处理其实只是个base64解码。

但是直接提交这串解码后的”wozilonghenshuai”是错误的。

使用这个牛批的插件查询一下加密算法,发现这里用了AES。apk里验证的key应该就是AES的密钥。于是我们想办法寻找正确的key。

因为导出表里有hook相关函数,我们找到了这里,注册了对strcmp函数的hook。看一下这个注册函数的原型。

 HOOK_STATUS registerHook(Elf_Addr orginalFunAddr, Elf_Addr newFunAddr,
 Elf_Addr* callOrigin); 
 #参数(原始函数地址, 新函数地址, 调用原始函数).

结合inline hook的核心思想:通过替换目标函数头部指令实现在函数执行之前跳转到其他的指令区域,执行完毕跳转回到原来的函数,跳转到的指令区域通常是我们自己编写的函数。 那么执行到strcmp函数时,事实上先跳转到了sub_ E28h函数,执行完毕后跳回strcmp比较。

把传入的参数a1进行base64解码,然后作为key传入sub_1388,也就是aes解密函数,最后return回到原函数strcmp。

flag{fake_func_3nfxvs}

MagicImageView

程序要求输入解密所用的key。放到jeb里先看一下java层。

这里我们得知输入的key是16位,且用到了native层的getkey()函数和java层的readMagicImage(),而后者需要返回值为真才能获得congratulations。

这里还有用到另一个函数readImage()。于是我们去看一下具体这两个read函数的实现细节。

readMagicImage函数就是逐字节读取文件,调用decrypt函数解密,而密钥就是需要找到的key。

readImage函数则就是按字节读取图片。

分析可得,/assets/png目录下的bg.png经过加密得到了encrypt_png.dat,而通过readMagicImage函数将其解密成png显示出来。但是我们不知道key,这个关键的密钥,我们要求的也就是它。

再去看一下native层。

导出表里有三个相关函数。

decrypt的操作很简单。

当时这个getkey没看明白,导致也没能想明白怎么求key。 这里的操作是把输入的key和‘Welcome_to_sdnisc_2018_By.Zero’这个字符串对应位置进行异或得到最终的key,作为密钥解密图片。 我们得知了decrypt以及加密前后的文件,因为decrypt里只有异或和减法所以可逆,直接解出key。

# image.apk
# len = 16
s1 = 'Welcome_to_sdnisc_2018_By.Zero'
f = open('encrypt_png.dat','rb')
f1 = f.read()
f.close()
f = open('bg.png','rb')
f2 = f.read()
f.close()

key = ''
flag = ''

for i in range(16):
	key += chr((ord(f1[i])-1)^0x61^ord(f2[i]))

for i in range(16):
	flag += chr(ord(key[i])^ord(s1[i%16]))

print flag

把解得的key值输入程序中,获得flag

flag{y0ur'r3_g00d_aT_4ndr01d}