asong
攻防世界 reverse 进阶区 asong
题目文件:
https://www.jianguoyun.com/p/DQ3g5b4QiNbmBxjX_fQC (访问密码:AgV9Sh)
主要是集中我们常见的处理方式的整合, 注意一个对于out文件要open 然后read读入,另外python3要使用rb 模式,因为会出现不可打印字符,直接复制会出错,而r模式会报错。
程序分析
首先看到是压缩包里面是一个64-elf, 两个文件, 其中一个out还是乱码,
然后查看下程序。配合动调基本可以确定流程,
然后这里是标注好了的:
main
main
函数是这样子, 一开始申请两块空间,一块在后面用于放数据,另一块保存flag:
其中的函数reada
, 就是读取flag,
copy
然后copy
中,是判断flag格式并且保留中间的部分, 复制到申请的flag内存块中,
j_sort
然后j_sort
函数, 读取那个’that_girl’ 的文件,然后在函数sort中处理, 最后根据处理结果得到data中的对应位置自增一个, 这个是类似与计数的一个效果:
sort
然后其中的sort
函数, 一个逆向中也比较常见的按字符进行转换的流程:
经北风师傅提醒,发现那个"?"的位置是算错了,还好逆flag计算的时候没用到,
set_cipher
然后后面就是set_cipher
函数, 是由我们处理好了的data和flag生成一个cipher:
流程主要是, 先吧flag和那个txt文档一样在sort中处理,然后取出来对应的数值,形成一个cipher,
其实这是吧这个flag中字符转化为, 这个字符在txt文件中出现的次数,是大致这个意思,
然后后面经过replace和or两个处理,最后写入到out文件中,所以我们的out文件中的数据应该是最后的cipher,
replace
然后是转换函数, 就是个互相换位置,这个过程中生成的呼唤的数据还是有点意思,
or
这个也是比较常见的一个位运算配合按位或的操作,
逆向
加密流程了解了, 我们逆向去解密,
最开始先从out文件读入最后的cipher,
s = open('out',mode='rb').read()
re_or
还是一些简单题目会常用的位操作, 这个位置用ipython多调几次还是比较好理解, 主要有前后两位之间的按位或操作:
temp = arr[len(arr)-1] & 0x7
for i in range(len(arr)):
brr.append((temp << 5) | (arr[i] >> 3))
temp = arr[i] & 0x7
re_replace
首先我们ida-python导出这个rep_data
:
addr = 0x6020a0
arr = []
for i in range(38):
arr.append(Dword(addr+4*i))
print(arr)
然后我们去得到中间实际上取到的值:
arr = [....