题目

CSDN免积分下载

文件

先查壳,有壳脱壳,没壳拖入IDA
64位无壳elf

IDA

image.png

解题

题目描述

菜鸡发现这个程序偷偷摸摸在自己的机器上搞事情,它决定一探究竟

答案

SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

Writeup

解题思路

已知数据

IDA经常无法正确识别数据类型并显示,对比IDA不同窗口:
image.png
发现两个字符串,分别为flag中的:

  1. 明文:SharifCTF{????????????????????????????????}——32个?
  2. 密文:c61b68366edeb7bdce3c6820314b7498——32个数字

image.png
很明显,c61b68366edeb7bdce3c6820314b7498就是要填入SharifCTF{数据}的待处理数据

代码逻辑

image.png
代码分为两大部分,将数据处理后会写入到本地的“/tmp/flag.txt”文件中。
所以解题方式有两种:

  1. 通过理解代码对数据的处理,纯粹通过“算法”还原出符合逻辑的数据;
  2. 通过动态调试,在数据写入但未删除文件前,查看内存或文件——这个可能更符合出题者的考察点,但是可能大部分人都没有对应的调试环境

    “算法”还原

    IDA中的判断为:
    1. 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))

  1. <a name="wuKsm"></a>
  2. ##### 扩展:取余
  3. 除以2取余,如果余数为零就是偶数,为1就是奇数:
  4. ```python
  5. num = int(input("输入一个数字: "))
  6. if (num % 2) == 0:
  7. print("【{0}】是偶数".format(num))
  8. else:
  9. print("【{0}】是奇数".format(num))

奇偶数处理

所以IDA中这一段的意思为,将“SharifCTF{????????????????????????????????}”的32个?,替换为对密文(c61b68366edeb7bdce3c6820314b7498)奇偶数判断后处理的32个数字:
image.png
将密文字符串(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))

image.png

动态(有ELF调试环境推荐)

运行

Linux+IDA联调环境搭建
在数据处理后的代码段处下断即可:
image.png
断下时查看数据:
image.png