1. 介绍

本题是xctf攻防世界中Reverse的进阶区的题EasyRE。

下载下来以后是一个exe文件:210f1e18ac8d4a15904721a2383874f5.exe

2. 分析

首先看下文件格式为windows 下的32位程序

$ file 210f1e18ac8d4a15904721a2383874f5.exe
210f1e18ac8d4a15904721a2383874f5.exe: PE32 executable (console) Intel 80386, for MS Windows

先在windows下运行一下,输入时提示:input:,输入以后按下回车却没有输出。

2.1 静态分析

先拖进IDA 里看看吧!找到之前命令行中的提示字符串 input ,找到交叉引用该字符串的地方为函数sub_401080。(在查看strings windows的时候眼前一亮发现有个 flag{NP2NiaNXx1ClGYVQ50} ,但是输入以后发现并不是真正的flag…

F5查看函数sub_401080的伪代码。字符串 input 的地址为0x402150,结合代码,可以判断sub_401020函数为printf函数。再往下发现地址0x402158开始的字符串为%s,说明sub_401050应该是scanf函数,将用户输入保存到v7中。


得到输入以后,对v7的长度进行检查,从代码中可知v7长度必须为24个字符。

接下来以 v8地址+7 位置处的字符赋值给v2,根据IDA的分析提示,v7的起始地址为ebp-24h(ebp-36), v8的起始地址为ebp-14h(ebp-20)。假设我输入的是abcdefghijklmnopqrstuvwx ,那么在栈中应该是下面的情况。也就是v2的初始值是用户输入的最后一个字符x

高地址 ebp-13 x
| ebp-14 w
|
| ebp-20 q
|
ebp-35 b
低地址 ebp-36 a

每次循环中通过v1控制对用户输入字符串的遍历,将v2的值赋值给v3,然后v2地址自减1,也就是逆序取下一个字符。将v3保存的当前字符赋值给数组 byte_40336C[v1]。所以这个部分其实就是逆序提取用户输入,保存到数组byte_40336C的过程。


接下来对数组byte_40336C的每个值x进行 (x+1)^6的操作。


最后将数组byte_40336C,也就是一个字符串,与地址0x402124开始的字符串进行比较。如果相同,即strcmp返回值为0,则调用printf函数输出 right\n

双击unk_402124,选中24个字符,按下 Shift + E 提取,选择 string literal ,得到的字符串为: xIrCj~<r|2tWsv3PtI\x7Fzndka

至此,整个程序的逻辑很清楚了:

  • 在第1个部分中,读取用户输入
  • 在第2部分中,判断用户输入的长度。逆序提取用户输入,保存到数组中(其实是个字符串)
  • 在第3部分中,对数组每个值x进行 (x+1)^6的操作
  • 在第4部分中,检查得到的数组(字符串)与xIrCj~<r|2tWsv3PtI\x7Fzndka 是否相等,相等则成功解决。

用python写脚本逆出正确的输入 flag{xNqU4otPq3ys9wkDsN}

# user_input逆序,存到arr数组中
# arr中的每个字符,进行 (each+1)^6 的操作
# 将arr与target比较,相同的时候输出"right"
res = ""
for each in target:tmp = (ord(each) ^ 6) - 1  # 异或的优先级!!tmp_char = chr(tmp)# print("tmp:{}, tmp_char:{}".format(tmp, tmp_char))res += tmp_charres = res[::-1]
print("flag:", res)  # flag{xNqU4otPq3ys9wkDsN}

编写脚本的过程中有两个需要注意的:

  1. 异或运算的逆运算还是异或,比如:
x = 5
y = x^6  # 3, 0b101 ^ 0b110 => 0b011# 已知y,求x
x = y^6  # 0b011 ^ 0b110 => 0b101
  1. 异或运算的优先级是低于减号的:
5^6 -1  # => 0
(5^6) -1  # =>2

2.2 动态调试

一开始逆序提取那个部分有点迷,主要是不清楚那个v8的含义,也没注意到IDA在函数的前面有提示v8的地址。于是我通过Ollydbg动态调试帮助理解。

首先需要在动态调试过程中定位之前IDA分析的sub_401080函数。可以用字符串来定位。

也可以通过程序运行的方式来定位:
运行到0x1A134E时,控制台输出了 input:,说明这里可能就是我们需要分析调试的地方,但是不知道是printf函数还是就是IDA里的sub_401080函数。因此我输入以后直接F8运行,发现没有经过之前分析过的循环逻辑,程序就终止了。说明0x1A134E调用的函数应该是sub_401080函数。

在0x1A134E按F2 打断点,按ctrl+F2 重新运行。当再次运行到这里的时候,按F7 也就是Step Into,进入到函数中去调试。

0x1A1080就是sub_401080函数的起始地址。

需要分析IDA中 v2 = (char *)&v8 + 7; 的值是什么。通过调试可知是输入的最后一个字符开始,也就是x

3. 总结

可以根据输出字符串找到需要分析的函数,然后通过静态分析寻找用户输入在函数中的变换,如果有不懂的先跳过,后续用Ollydbg动态调试辅助理解。先对整个函数的逻辑,每个块的作用有个宏观的了解。

攻防世界Reverse进阶区-EasyRE-writeup相关推荐

  1. 攻防世界Reverse进阶区-answer_to_everything-writeup

    本题是xctf攻防世界中Reverse的进阶区的题answer_to_everything 题目来源: 2019_ISCC 题目描述:sha1 得到了一个神秘的二进制文件.寻找文件中的flag,解锁宇 ...

  2. 攻防世界 Reverse进阶区 BABYRE WP

    IDA下得到反汇编代码 显然,对于judge这个常量先与或处理,而后读取字符串s,判断s长度是否为14: 接下来这个judge(s)让我看不懂了,judge不是个数组吗,怎么可以这么使用? <关 ...

  3. 攻防世界web进阶区Web_php_wrong_nginx_config详解

    攻防世界web进阶区Web_php_wrong_nginx_config详解 题目 详解 题目 打开发现无论我们输入什么他都会弹出网站建设不完全 那么我们使用御剑进行扫描,扫描到了admin和robo ...

  4. 攻防世界web进阶区Web_python_block_chain详解

    攻防世界web进阶区Web_python_block_chain详解 题目 详解 51% 双花攻击 题目 详解 我们整理一下 Announcement: The server has been res ...

  5. 攻防世界MISC进阶区刷题记录

    文章目录 攻防世界MISC进阶区刷题记录 Ditf 运用stegextract进行分离 glance-50 gif图片分离组合脚本 hit-the-core Test-flag-please-igno ...

  6. 攻防世界 pwn进阶区----No.012 babyfengshui 解题思路

    攻防世界 pwn进阶区----No.012 babyfengshui 解题思路 1.本题解题思路 1.先期工作 1.运行程序查看基本逻辑 创建用户 展示用户 更新用户 删除用户 到这里就可以猜测这题有 ...

  7. 攻防世界高手进阶区——dice_game

    攻防世界高手进阶区--dice_game 题目里面啥都没有. 一.分析文件 checksec 只有栈溢出保护关闭了,其他都是开着的. 运行 可以看出是要猜数字,猜对50次. ida逆向 __int64 ...

  8. 攻防世界高手进阶区 ——forgot

    攻防世界高手进阶区 --forgot 看了半天,啥也没看懂,做出来了才发现啥也不是. 一,分析文件 checksec 还好,只开启了堆栈不可执行. 运行一下 翻译了一下,应该是判断邮箱是否合乎规矩. ...

  9. Revers篇:攻防世界reverse进阶re2-cpp-is-awesome

    攻防世界reverse进阶re2-cpp-is-awesome IDA分析 很简单的一个程序 程序流程分析 首先检查参数,参数少于2就退出,并提示:Usage: ./re2-cpp-is-awesom ...

最新文章

  1. Git系列之git log高级命令
  2. 服务器打开虚拟机电源重启,虚拟机服务器自动重启
  3. JS函数简单的底层原理 -变量重复声明无效,隐式申明,变量提升,函数提升,以及堆栈内存的变化
  4. hexo需要先编辑好html文件吗,教你定制Hexo的landscape打造自己的主题_html/css_WEB-ITnose...
  5. 敏捷个人新体系学习 - 1.实践的艺术
  6. linux 子shell
  7. 精选| 2019年7月R新包推荐(第32期)
  8. dom4j 解析xml Error on line 9717 of document 不允许有匹配 [xX][mM][lL] 的处理指令目标
  9. 理正深基坑弹性计算方法_理正深基坑软件应用全参数说明书
  10. 交互设计流程是怎样的?
  11. 怎样将图片变成圆形?教你裁剪图片的方法
  12. 海海软件发布动态网站加密(DRM版权保护)Beta版
  13. 网约护士来了?相关App不合规 两大安全问题最受关注
  14. python2.0下载_【Python for S60V2】Python for S60V2 V2.0官方免费下载_正式版下载-多特软件站...
  15. windows无法更改密码解决办法
  16. java计算机毕业设计vue健康餐饮管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  17. 团队作业收官——项目产品宣传文案和推广方案
  18. 【2019正睿金华集训】0803总结
  19. 2015年网页设计配色趋势预测
  20. LG30刷小米系统_闲鱼300块入手小米平板1,性能居然秒杀1099的小米平板4

热门文章

  1. 用devc++表白_【理工大表白墙】19级倪yl,风吹起如花般破碎的流年,而你的笑容摇晃摇晃,成为我命途中最美的点缀...
  2. 51自学网php视频教程全集,51自学网免费PhotoShop视频教程全集
  3. 幼儿园管理系统c语言,【资源学习】c语言程序代码,登录幼儿园200个小朋友的数据...
  4. python线程和c++线程的区别_Python、线程、吉尔和C++
  5. 区块链技术应用场景设想
  6. 深入理解Java虚拟机-高效并发
  7. linux之ps命令--进程快照
  8. cad指定服务器名称,天正打开后CAD显示服务器名称为空? CAD 服务器名称为空
  9. bootmgr快速修复win7_win7 iso镜像下载(Win7安装版_非GHOST ISO镜像)
  10. 关于数据仓库、数据湖、数据平台和数据中台的概念和区别