【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
```
这样对照着给出的题目文件思路就清晰的多。
## 最后
也有人问过,题目的意义在哪里。其实很简单,我只是想带大家回到最开始的调试和猜解。
都怪这该死服务器,拖慢了大家的解题进度。
如果有问题欢迎大家指正。
总之,出题人立正挨打! 感谢Processor带来的游戏。 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行是不是不太妥。 不会,看不懂{:1_918:} 热心参与共获提升! 三脸懵逼 原来是这样的....想到了是计算的了,不过我看到EAX,ECX这些,本来还以为是汇编的计算结果,你还用了个ZF...真是把我迷惑的够呛啊...
但是怎么看那几个回显,都不像是汇编计算,如果多看看,也许还是有希望能解出来的...
最终放弃,还是因为服务器太卡了,真的太卡了
另外,验证的方式,和你这个代码好像有点不太一样吧,你这个代码要是我没看错,是有一位不对,就直接提示错误了,也就是我输了,23位,第一位不对,就直接WRONG了
但是我实际解题的时候,他是输出了一大堆,才返回WRONG,就是按了很多次空格后,才会提示WRONG,这两种方式,区别还是挺大的 popdisk 发表于 2021-2-28 10:28
print "Welcome to Processor's debugger!"
print "Please input you flag now! ...
怎么拿到源文件的? gunxsword 发表于 2021-2-28 10:30
怎么拿到源文件的?
题目放出来了,在原来的活动贴里。另外,你楼上的问题只是因为网卡了,数据还没传过来导致的,不是bug。 popdisk 发表于 2021-2-28 10:35
题目放出来了,在原来的活动贴里。另外,你楼上的问题只是因为网卡了,数据还没传过来导致的,不是bug。
哦,原来是这样
哎,那服务器实在是....这个题还是挺不错的,有点意思,全是服务器的锅!
感谢回复!