practice-4之IDA用法

第四题

打开是这样的,看English了解掷骰子,输入任意数字(3),我发现第一次输入三进行到下一步,但是退出重启之后在输入3则为错的,所以想要在9^5种可能中猜出随机变化的数字几率,除非脸白。,还是分析源程序得到答案吧

用IDA打开程序。进入之后shift+f12查找关键字符串。

找到“Nice job.here is the flag”,双击跳转过去。会看到WinMain函数(常见的C++程序函数)直接反汇编

然后就是分析代码过程了

v56 = std::operator<<>((int)&std::cout, “[*] Nice job, here is the flag: “);
v57 = std::operator<<,std::allocator>(v56, &v88);

std::operator<<其实就是C++中的cout<<,所以这边就是输出那句话之后输出v88里的字符串,所以v88就变成了解题的关键了。

(新学到,之前没用过)在IDA里按art+T,搜索v88,在ctrl+T 继续查找下一个

第一个找到的:

std::string::operator=((std::string *)&v88, &byte_444240);

这是一个赋值语句,鼠标双击byte_444240即可看到字符串的内容,选择字符串开头到00之前的所有字符,(新知识)按下shift+E导出数据,得到:

在回到伪代码查看v88

最后一句很明确就是find/查找v88开头是不是ebCTF字样,然后代码里唯一对v88操作的只有跟v91去异或。
如果不想用暴力破解得到flag的话(因为v88知道了,也就是经过异或运算就可以得到flag,所以完全可以暴破),就再查找看v91的相关语句。

找到
std::string::operator=((std::string *)&v91, &byte_444309);
同样双击byte_444309查看字符串:
02370F350F3C15073C302A30551237151E350151

与v91相关的:

第一个是跟v90异或,第二个是跟v89异或
所以目标再盯住v89、v90即可

除了上面的截图,前面每次掷骰子正确之后也对v89进行了操作,容易遗漏最后v89计算出来是100

v90有关见上图,看看程序,不难看出v90取16
综上,把v91这个字符串异或v89后,再异或v90,再跟v88异或就得到flag。用python来计算:

# -*- coding:utf-8 -*-

def flag():
  v89,v90=100,16
  v91="02370F350F3C15073C302A30551237151E350151"
  v88="132138153D3357472D276A73440526595C79174445771A75497D054A78746A70420271050F2208"

  v91=[ord(i) for i in v91.decode('hex')]
  for i in xrange(len(v91)):
v91[i]^=v89^v90

  v88=[ord(i) for i in v88.decode('hex')]
  res=""
  for i in xrange(len(v88)):
res+=chr(v88[i]^v91[i%len(v91)])
  print res
  pass

if __name__ == '__main__':
  flag()
Contents
|