ida进入main函数

int __cdecl main(int argc, const char **argv, const char **envp)
{__int64 v3; // raxint v5[52]; // [rsp+0h] [rbp-270h] BYREFint v6[52]; // [rsp+D0h] [rbp-1A0h] BYREFint v7[7]; // [rsp+1A0h] [rbp-D0h] BYREFint v8; // [rsp+1BCh] [rbp-B4h]int v9; // [rsp+1C0h] [rbp-B0h]int v10; // [rsp+1C4h] [rbp-ACh]int v11; // [rsp+1C8h] [rbp-A8h]int v12; // [rsp+1CCh] [rbp-A4h]int v13; // [rsp+1D0h] [rbp-A0h]int v14; // [rsp+1D4h] [rbp-9Ch]int v15; // [rsp+1D8h] [rbp-98h]int v16; // [rsp+1DCh] [rbp-94h]int v17; // [rsp+1E0h] [rbp-90h]int v18; // [rsp+1E4h] [rbp-8Ch]int v19; // [rsp+1E8h] [rbp-88h]int v20; // [rsp+1ECh] [rbp-84h]int v21; // [rsp+1F0h] [rbp-80h]int v22; // [rsp+1F4h] [rbp-7Ch]int v23; // [rsp+1F8h] [rbp-78h]int v24; // [rsp+1FCh] [rbp-74h]int v25; // [rsp+200h] [rbp-70h]int v26; // [rsp+204h] [rbp-6Ch]int v27; // [rsp+208h] [rbp-68h]int v28; // [rsp+20Ch] [rbp-64h]int v29; // [rsp+210h] [rbp-60h]int v30; // [rsp+214h] [rbp-5Ch]int v31; // [rsp+218h] [rbp-58h]int v32; // [rsp+21Ch] [rbp-54h]int v33; // [rsp+220h] [rbp-50h]int v34; // [rsp+224h] [rbp-4Ch]int v35; // [rsp+228h] [rbp-48h]int v36; // [rsp+22Ch] [rbp-44h]int v37; // [rsp+230h] [rbp-40h]int v38; // [rsp+234h] [rbp-3Ch]int v39; // [rsp+238h] [rbp-38h]int v40; // [rsp+23Ch] [rbp-34h]int v41; // [rsp+240h] [rbp-30h]int v42; // [rsp+244h] [rbp-2Ch]int v43; // [rsp+248h] [rbp-28h]int v44; // [rsp+24Ch] [rbp-24h]int v45; // [rsp+250h] [rbp-20h]int v46; // [rsp+254h] [rbp-1Ch]int v47; // [rsp+258h] [rbp-18h]int v48; // [rsp+25Ch] [rbp-14h]int v49; // [rsp+260h] [rbp-10h]v7[0] = 1;v7[1] = 1;v7[2] = -1;v7[3] = 1;v7[4] = -1;v7[5] = 1;v7[6] = -1;v8 = 0;v9 = 0;v10 = 0;v11 = 0;v12 = 1;v13 = -1;v14 = 0;v15 = 0;v16 = 1;v17 = 0;v18 = 0;v19 = 1;v20 = 0;v21 = -1;v22 = -1;v23 = 0;v24 = 1;v25 = 0;v26 = 1;v27 = -1;v28 = 0;v29 = -1;v30 = 0;v31 = 0;v32 = 0;v33 = 0;v34 = 0;v35 = 1;v36 = -1;v37 = -1;v38 = 1;v39 = -1;v40 = 0;v41 = -1;v42 = 2;v43 = 1;v44 = -1;v45 = 0;v46 = 0;v47 = -1;v48 = 1;v49 = 0;memset(v6, 0, 0xC0uLL);v6[48] = 0;memset(v5, 0, 0xC0uLL);v5[48] = 0;Step_0((int (*)[7])v7, 7, (int (*)[7])v6);Step_1((int (*)[7])v6, 7, (int (*)[7])v5);v3 = std::operator<<<std::char_traits<char>>(&_bss_start, "Please help me out!");std::ostream::operator<<(v3, &std::endl<char,std::char_traits<char>>);Step_2((int (*)[7])v5);system("pause");return 0;
}

可以看到这里有三个函数,Step_0,Step_1,Step_2,应该就是对已有数据的操作了。变量中v9已知;v7,maze未知,所以猜测Step_0函数负责将v9的值经过变换传递给v7,Step_1负责将v7的值变化传递给maze,最终由在Step_2处传入maze数组。
进入Step_2函数

__int64 __fastcall Step_2(int (*a1)[7])
{int v1; // eax__int64 v2; // rax__int64 v3; // rax__int64 result; // rax__int64 v5; // raxchar v6[35]; // [rsp+10h] [rbp-30h] BYREFchar v7; // [rsp+33h] [rbp-Dh] BYREFint v8; // [rsp+34h] [rbp-Ch]int v9; // [rsp+38h] [rbp-8h]int v10; // [rsp+3Ch] [rbp-4h]v10 = 0;v9 = 0;v8 = 0;while ( v8 <= 29 && (*a1)[7 * v10 + v9] == 1 ){std::operator>><char,std::char_traits<char>>(&std::cin, &v7);v1 = v8++;v6[v1] = v7;if ( v7 == 100 ){++v9;}else if ( v7 > 'd' ){if ( v7 == 's' ){++v10;}else{if ( v7 != 'w' )goto LABEL_14;--v10;}}else if ( v7 == 'a' ){--v9;}else{LABEL_14:v2 = std::operator<<<std::char_traits<char>>(&_bss_start, "include illegal words.");std::ostream::operator<<(v2, &std::endl<char,std::char_traits<char>>);}}if ( v10 == 6 && v9 == 6 ){v3 = std::operator<<<std::char_traits<char>>(&_bss_start, "Congratulations!");std::ostream::operator<<(v3, &std::endl<char,std::char_traits<char>>);output(v6, v8);result = 1LL;}else{v5 = std::operator<<<std::char_traits<char>>(&_bss_start, "Oh no!,Please try again~~");std::ostream::operator<<(v5, &std::endl<char,std::char_traits<char>>);result = 0LL;}return result;
}

从数组(a1)[7i+j]的表示中可以看出,数组的行数为7。(7*7 的二维数组)

由while循环看出,输入最长不能超过30,且必须是”w”,”a”,”d”,”s”。

输入”w”,i–;输入”s”,i++;

输入”a”,j–;输入”d”,j++;

可以看出迷宫从左上角出发。
从最后的判断条件i6,j6可以看出,最终移动目标是右下角。、
这样就分析清楚了我们的输入与行走方向的对应关系。之后我们知道迷宫究竟是怎么样的。这由Step_0和Step_1函数决定。

我们可以继续对他们两个函数进行静态分析,写出他们的功能,求出迷宫表达式。但是因为我们是从Step_2函数的位置才开始输入的,Step_1的输出结果与我们的输入无关,是一个固定不变的值,所以我们可以用gdb进行动态分析,让他直接运行到Step_2函数处,然后直接查看maze的代码。具体操作如下:
输入命令:info functions Step,返回所有名称带有Step的函数:

我们给Step_2函数下一个断点:b Step_2

输入命令:r运行至Step函数开始位置。函数刚开始运行时,会为我们的输入分配内存空间。因为是x64系统,所以函数传递参数时会先通过寄存器传参。下图框起来的部分就是将函数参数存储到栈中的过程:

输入命令:print $寄存器。将输入的参数打印出来,rdi所存的参数就是maze数组的起始地址。

输入命令:x/80dw $1,将该片内存空间的数据打印出来,取前49个数据,这便是maze数组的元素:



flag: UNCTF{ssddwdwdddssaasasaaassddddwdds}

攻防世界easy_Maze相关推荐

  1. 攻防世界 easy_Maze

    easy_Maze 这道题还是挺好玩的. 由题目我们能知道是关于迷宫的题. 下载下来是elf文件, 查壳后无壳, 在linux下运行看看大概流程. 载入IDA, 先分析了接受我们输入的字符的函数. 知 ...

  2. 【攻防世界001】Guess-the-Number

    攻防世界之前刷了几十题了,没写wp,感觉很简单没啥意思.后来参加了几次比赛,发现有点干不动,决定还是老老实实刷题好了.这是第一篇wp,这题很简单,是个jar,用jd-gui可以得到java源码. 原来 ...

  3. 攻防世界(pwn)--Mary_Morton 利用格式化字符串+栈溢出破解Canary的保护机制

    ctf(pwn) canary保护机制讲解 与 破解方法介绍 程序执行流程 有三个选项,1是利用栈溢出,2是利用格式化字符串,3是退出;可连续输入多次; IDA分析 解题思路 程序存在canary保护 ...

  4. 攻防世界(Pwn) forgot---栈溢出;(方法二)

    攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...

  5. 攻防世界(Pwn) forgot---栈溢出;(方法一)

    攻防世界(Pwn) forgot-栈溢出:(方法二) 介绍 这道题表面看起来有点复杂,其实很简单,有两种方法可以来做这一道题; 方法一(精确打击) 文件运行流程是: 1.先输入名字 2. 输入一串字符 ...

  6. 攻防世界misc新手_[攻防世界]mobile新手练习区easy-apk

    [攻防世界]mobile新手练习区easy-apk easy-apk最佳Writeup由129师386旅独立团 • devi1提供 难度系数: 7.0 题目来源: 暂无 题目描述:无 题目场景: 暂无 ...

  7. 攻防世界 ——crypto

    目录 新手区部分题解: 1,easy_RSA 2,Normal_RSA 3, 幂数加密 4,easy_ECC 高手进阶区部分题题解 5, ENC 6,告诉你个秘密 7,Easy-one 8,说我作弊需 ...

  8. 攻防世界———MISC 高手区题解

    目录 1,base64stego 2,easycap 3,Avatar 4,What-is-this 5,签到题 6,Training-Stegano-1 7,Excaliflag 8,Get-the ...

  9. 攻防世界 web(二)

    这周接着刷攻防世界的web题( ̄︶ ̄)↗ 1.command_execution 看提示这题为命令执行漏洞(command_execution),关于命令执行漏洞,我前面有篇博客详细介绍了,大家不了解 ...

最新文章

  1. GridView 始终显示 Pager 分页行的一种方法
  2. solr管理界面详解
  3. 论如何优雅的处理回文串 - 回文自动机详解
  4. [转]清除mysql表中数据
  5. VTK:Utilities之DetermineActorType
  6. chrome控制台如何把vw显示成px_你可能不知道的chrome调试技巧
  7. 深度学习论文阅读进阶路径图
  8. linux rpm 查找,Linux下 rpm 命令查询方法
  9. Mesos + Marathon + Chronos + Docker环境安装
  10. 后缀数组模板 hdu1403
  11. 《流畅的Python第二版》读书笔记——序列数组
  12. Atitit 微服务实践 艾提拉著 微服务主要解决几个问题负载均很 目录 1. 微服务的模式 http请求层 vs服务层 1 1.1. Http vs 服务层优缺点 1 2. 实现技术 2
  13. 大数据项目实训总结_最详细大数据项目落地路线图实践总结
  14. 深度学习笔记(一)——M-P模型(神经元模型)
  15. Spring项目启动时Error creating bean with name ‘xxxxxx‘: Bean with name ‘xxxxxx‘ has been injected into ot
  16. 泰森多边形算法 java_泰森多边形构建原理
  17. 《深度学习之美》第3章
  18. Linux—添加开机启动
  19. java 1st 2nd 3rd 4th_为啥第一是1ST,第二是2ND,第三是3RD,第四开始都是TH呢1ST、2ND、...-3rd-英语-耿佬杜同学...
  20. oracle访问控制策略查看,ORACLE 安全访问策略VPD与ORA-28132

热门文章

  1. 关于css文字超出显示省略号失效
  2. 用腾讯电脑管家修复系统漏洞之后,win7远程桌面连接不上,解决办法
  3. 计算机关闭的图标,怎么关闭win7系统操作中心图标?win7系统关闭操作中心图标的方法...
  4. Python基础入门篇【2】--python脚本结构
  5. Windows11和Windows11家庭中文版ISO资源下载
  6. 【新手向】仅需四步!搭建Minecraft云服务器
  7. Redis分片的实现
  8. Python 编写程序,输出所有由1、2、3、4这4个数字组成的素数,且每个素数中每个数字只用一次
  9. 前瞻、后顾、负前瞻、负后顾用法
  10. Intellij idea 代码提示忽略字母大小写和常用快捷键及设置