BUUCTF Reverse(easyre,reverse1,reverse2)

目录

easyre

reverse1

补充strncmp函数知识

reverse2


easyre:

解题思路:先使用exeinfoPE判断exe文件是64位还是32位,再使用相应的IDA分析

1.把exe文件丢到exeinfoPE,判断为64位可执行文件

BUUCTF Reverse(easyre,reverse1,reverse2)_第1张图片

BUUCTF Reverse(easyre,reverse1,reverse2)_第2张图片

2.使用64-bit IDA分析该exe文件

BUUCTF Reverse(easyre,reverse1,reverse2)_第3张图片

一路ok+yes

3.在 View-A页面可直接看到flag

BUUCTF Reverse(easyre,reverse1,reverse2)_第4张图片

Shift+F12进入Strings window页面也可找到flag

BUUCTF Reverse(easyre,reverse1,reverse2)_第5张图片

 按F5进入 Pseudocode-A  在左侧main函数下同样可以找到flag

BUUCTF Reverse(easyre,reverse1,reverse2)_第6张图片

reverse1:

1.同样丢入exeinfoPE,判断为64为可执行文件

2.使用64-bit IDA分析该exe文件

3.粗略寻找后并未找到flag相关信息

Shift+F12进入Strings window页面

BUUCTF Reverse(easyre,reverse1,reverse2)_第7张图片

发现类似flag格式,提交{hello_world}或者flag{hello_world}均不对

继续搜寻其他信息

 4.发现  this is the right flag! 并双击跟进BUUCTF Reverse(easyre,reverse1,reverse2)_第8张图片

 BUUCTF Reverse(easyre,reverse1,reverse2)_第9张图片

DATA XREF 意思是数据交叉引用,猜测数据经过某种处理

5.双击sub_1400..跟进

BUUCTF Reverse(easyre,reverse1,reverse2)_第10张图片

6.按F5查看伪代码

 BUUCTF Reverse(easyre,reverse1,reverse2)_第11张图片

 浏览代码不难理解,Str1为用户输入字符串,Str2为flag

而在24行处对Str2数组进行处理,将字符'o'(asc:111)转化为'0'(asc:48)

补充strncmp函数知识

函数声明

int strncmp(const char *str1, const char *str2, size_t n)

参数

  • str1-- 要进行比较的第一个字符串。

  • str2-- 要进行比较的第二个字符串。

  • n-- 要比较的最大字符数。 [3] 

返回值

该函数返回值如下:

  • 如果返回值 < 0,则表示 str1 小于 str2。

  • 如果返回值 > 0,则表示 str2 小于 str1。

  • 如果返回值 = 0,则表示 str1 等于 str2。

 现将o转化为0以获得flag:flag{hell0_w0rld}

reverse2:

1.reverse2虽然不带exe后缀,仍可用exeinfoPE判断为64位BUUCTF Reverse(easyre,reverse1,reverse2)_第12张图片

2.与reverse1相同的操作进入Strings window页面

猜测最后一行是flag

 BUUCTF Reverse(easyre,reverse1,reverse2)_第13张图片

3.双击.rodata:0000000000400925    00000018    C    this is the right flag!跟进

4.双击loc_400854并按F5查看伪代码

BUUCTF Reverse(easyre,reverse1,reverse2)_第14张图片

 可见若 (&flag+i)地址存放的字符若为i或r,则将其转换为1

最终得到flag{hack1ng_fo1_fun}

你可能感兴趣的:(flag)