Processor 发表于 2021-2-28 09:47

【2021春节】逆向高级题 -- 出题人出来挨打了

## 前言
首先各位师傅们节日快乐。

很高兴能参与到这次活动中。
随便说一下题目的初衷吧。这次题目重点放在了题目的趣味性,也是曾经在某次比赛上受到的启发。个人觉得作为一个二进制选手,调试能力和猜解能力算是基本功了。也可能题目过于CTF化,导致很多师傅对着没有附件只有一行nc的逆向题无从下手。

可能有些师傅是在题目给出hint之后爆破得到flag,但我觉得大可不必。

## 题目
题目环境是docker + xinetd,限制了IP的最大链接数为10.

已经有师傅写过题目分析了,这里就再多啰嗦一句。

```
a = raw_input()
result =

check = [-56, -50, -118, -105, -98, -101, -117, -105, -96, -42, -80, 89, 78, 70, 177, 86, 126, 80, 80, 96, 177, 109, 28]

arr1 =

for i in range(0,23):
    if i <= 10:
      result = ~ord(a)
      result = result ^ arr1
    else:
      result = ord(a) + arr1
      result = result ^ 0xcc

    if result != check:
      print "Wrong Flag!"
      exit(0)

print "Yes, You got it!"
print result
```
这样对照着给出的题目文件思路就清晰的多。

## 最后
也有人问过,题目的意义在哪里。其实很简单,我只是想带大家回到最开始的调试和猜解。
都怪这该死服务器,拖慢了大家的解题进度。
如果有问题欢迎大家指正。

总之,出题人立正挨打!

Hmily 发表于 2021-2-28 09:59

感谢Processor带来的游戏。

popdisk 发表于 2021-2-28 10:28

print "Welcome to Processor's debugger!"
print "Please input you flag now!"

input = raw_input()

if not input:
    print "Are you kidding me?"
    exit(0)

lenth = len(input)
if lenth <= 10:
    print "Short flag!"
    exit(0)
   
print "len:%d" % (lenth)
print "OK,let's debug it! You can 'Step' by 'Space'!"
print "--------------INFO--------------"

def debuginfo(dic):
    print "eax: %d" %(dic['eax'])
    print "ebx: %d" %(dic['ebx'])
    print "ecx: %d" %(dic['ecx'])
    print "zf: %d" %(dic['zf'])
    print "--------------INFO--------------"

index = 0
idx = 0
arr =
check = [-56, -50, -118, -105, -98, -101, -117, -105, -96, -42, -80, 89, 78, 70, 177, 86, 126, 80, 80, 96, 177, 109, 28]
result =

dic = {'eax': 0, 'ebx': 0, 'ecx': 0, 'zf': 0}

while raw_input() == ' ':

    if index <= 10:
      dic['eax'] = ~ord(input)
      dic['ebx'] = 0
      dic['ecx'] = index
      dic['zf'] = 0
      debuginfo(dic)

      if raw_input() == ' ':
            dic['eax'] = dic['eax'] ^ arr
            dic['ebx'] = arr
            dic['ecx'] = index
            dic['zf'] = 1
            result = dic['eax']
            debuginfo(dic)

    else:
      dic['eax'] = ord(input) + arr
      dic['ebx'] = arr
      dic['ecx'] = index
      dic['zf'] = 1
      debuginfo(dic)

      if raw_input() == ' ':
            dic['eax'] = dic['eax'] ^ 0xcc
            dic['ebx'] = 0xcc
            dic['ecx'] = index
            dic['zf'] = 1
            result = dic['eax']
            debuginfo(dic)


    index = index + 1
    if index == 23 or index == lenth:
      break
   

while raw_input() == ' ':
    dic['eax'] = result
    dic['ebx'] = check
    dic['ecx'] = idx
    if dic['eax'] != dic['ebx']:
      dic['zf'] = 1
      print "Wrong flag, try again!"
      exit(0)
    else:
      dic['zf'] = 0
    debuginfo(dic)
    idx = idx + 1
   
    if idx == 23 or idx == lenth:
      if lenth == 23:
            print "Yes, you got it!"
            exit(0)
      else:
            print "Close to right!"
            exit(0)

emmm...这是源文件吗?你看看第79行是不是不太妥。

dongge666 发表于 2021-2-28 10:05

不会,看不懂{:1_918:}

lookip 发表于 2021-2-28 10:09

热心参与共获提升!

fuy56go 发表于 2021-2-28 10:15

三脸懵逼

gunxsword 发表于 2021-2-28 10:19

原来是这样的....想到了是计算的了,不过我看到EAX,ECX这些,本来还以为是汇编的计算结果,你还用了个ZF...真是把我迷惑的够呛啊...
但是怎么看那几个回显,都不像是汇编计算,如果多看看,也许还是有希望能解出来的...
最终放弃,还是因为服务器太卡了,真的太卡了

另外,验证的方式,和你这个代码好像有点不太一样吧,你这个代码要是我没看错,是有一位不对,就直接提示错误了,也就是我输了,23位,第一位不对,就直接WRONG了
但是我实际解题的时候,他是输出了一大堆,才返回WRONG,就是按了很多次空格后,才会提示WRONG,这两种方式,区别还是挺大的

gunxsword 发表于 2021-2-28 10:30

popdisk 发表于 2021-2-28 10:28
print "Welcome to Processor's debugger!"
print "Please input you flag now! ...

怎么拿到源文件的?

popdisk 发表于 2021-2-28 10:35

gunxsword 发表于 2021-2-28 10:30
怎么拿到源文件的?

题目放出来了,在原来的活动贴里。另外,你楼上的问题只是因为网卡了,数据还没传过来导致的,不是bug。

gunxsword 发表于 2021-2-28 10:36

popdisk 发表于 2021-2-28 10:35
题目放出来了,在原来的活动贴里。另外,你楼上的问题只是因为网卡了,数据还没传过来导致的,不是bug。

哦,原来是这样
哎,那服务器实在是....这个题还是挺不错的,有点意思,全是服务器的锅!

感谢回复!
页: [1] 2 3 4 5 6
查看完整版本: 【2021春节】逆向高级题 -- 出题人出来挨打了