题目
文件
IDA
解题
题目描述
菜鸡发现这个程序偷偷摸摸在自己的机器上搞事情,它决定一探究竟
答案
SharifCTF{b70c59275fcfa8aebf2d5911223c6589}
Writeup
解题思路
已知数据
IDA经常无法正确识别数据类型并显示,对比IDA不同窗口:
发现两个字符串,分别为flag中的:
- 明文:SharifCTF{????????????????????????????????}——32个?
- 密文:c61b68366edeb7bdce3c6820314b7498——32个数字
很明显,c61b68366edeb7bdce3c6820314b7498就是要填入SharifCTF{数据}的待处理数据
代码逻辑
代码分为两大部分,将数据处理后会写入到本地的“/tmp/flag.txt”文件中。
所以解题方式有两种:
- 通过理解代码对数据的处理,纯粹通过“算法”还原出符合逻辑的数据;
- 通过动态调试,在数据写入但未删除文件前,查看内存或文件——这个可能更符合出题者的考察点,但是可能大部分人都没有对应的调试环境
“算法”还原
IDA中的判断为:
这是一个很明显的奇偶数判断逻辑。if ( (i & 1) != 0 )
奇偶数的判断
按位与
奇数的二进制表示法的最低位是1,偶数的最低位是0。
如果是奇数和1相与(与运算 = “& 1”),那么结果就是1;偶数结果则是0: ```python num = int(input(“输入一个数字: “))
if (num & 1) == 0: print(“【{0}】是偶数”.format(num)) else: print(“【{0}】是奇数”.format(num))
<a name="wuKsm"></a>
##### 扩展:取余
除以2取余,如果余数为零就是偶数,为1就是奇数:
```python
num = int(input("输入一个数字: "))
if (num % 2) == 0:
print("【{0}】是偶数".format(num))
else:
print("【{0}】是奇数".format(num))
奇偶数处理
所以IDA中这一段的意思为,将“SharifCTF{????????????????????????????????}”的32个?,替换为对密文(c61b68366edeb7bdce3c6820314b7498)奇偶数判断后处理的32个数字:
将密文字符串(c61b68366edeb7bdce3c6820314b7498)以0位下标开始,偶数(0,2,4……)字符-1,奇数(1,3,5……)字符+1:
#明文
t = list('SharifCTF{????????????????????????????????}')
#密文
strPass = 'c61b68366edeb7bdce3c6820314b7498'
#下标
sub = 0;
'''
#for循环
for index in strPass:
'''
#While循环
while sub < len(strPass):
#奇偶数判断
if (sub & 1):
OddOrEven = 1;
else:
OddOrEven = -1;
#处理后的strPass字符串替换32个“?”
t[10 + sub] = chr(ord(strPass[sub]) + OddOrEven);
#下标递增
sub+=1;
print(''.join(t))
动态(有ELF调试环境推荐)
运行
Linux+IDA联调环境搭建
在数据处理后的代码段处下断即可:
断下时查看数据: