BUUCTF-reverse-reverse1(面向新手超详细)

拿到题目先查下壳(这里用的DIE,网上可以搜到下载)

BUUCTF-reverse-reverse1(面向新手超详细)_第1张图片

 64位,没有壳(壳是对代码的加密,起混淆保护的作用,一般用来阻止逆向)

然后拖进IDA(64位)进行反汇编

一般来说,先查看一下字符串,简单的题目会有flag或者敏感数据字符等信息,方便我们定位函数查看字符串的方法为shift+F12

BUUCTF-reverse-reverse1(面向新手超详细)_第2张图片

找到了关于flag的信息,双击点进去找到这段字符串的位置

BUUCTF-reverse-reverse1(面向新手超详细)_第3张图片ctrl+x(交叉引用)查看是哪段函数调用了该字符串

BUUCTF-reverse-reverse1(面向新手超详细)_第4张图片

点击“OK”进入该段程序,查看汇编代码

BUUCTF-reverse-reverse1(面向新手超详细)_第5张图片

汇编代码对于初学者来说读懂比较困难,可以按“F5”查看伪C代码

代码界面如图

BUUCTF-reverse-reverse1(面向新手超详细)_第6张图片

下面是详细解读:

第一步,定位 

一是定位加密后的flag字符串,而是准确定位加密的函数(如何加密的flag)

一般来说,是先去找引用"flag"的代码段,然后一步步定位到关键部分,找到真正把flag加密的函数,然后手工逆向或者写解密脚本得到真正的flag

第二步,手搓或者写脚本逆向(有些简单的加密方式可以直接手算,节省时间)

大部分题目逆向脚本建议用python写,语法比较简单,写起来比较快

回归正题:

先定位"this is the right flag"代码段

BUUCTF-reverse-reverse1(面向新手超详细)_第7张图片

不难猜测 "sub_1400111D1"是"printf"之类的输出函数。

strncmp(str1,str2,v3)是把str1与str2两字符串的前v3位数做一个比较,若str1=str2,返回0;大于返回正数,小于返回负数

if(!strncmp(str1,str2,v3))是一个判断语句,if()括号里面的内容如果为真,则输出

"this is the right flag",这时我们只需要知道什么情况为真。

然后看括号里面的内容 !( strncmp(str1,str2,v3) )为真的情况

!为非,所以只要( strncmp(str1,str2,v3) )为0, !( strncmp(str1,str2,v3) )即为真;为0的情况已经在上面对strncmp函数的讲解说过了,str1,str2两个字符串相等返回值即为0。

继续往上分析

 BUUCTF-reverse-reverse1(面向新手超详细)_第8张图片

前面已经讲过sub_1400111D1是print函数,不难猜测sub_14001128F是scanf函数,所以字符串str1为我们输入的内容。接下来看字符串str2.

随便找一个str2,双击点进去之后就找到了str2 '{hello_world}'

BUUCTF-reverse-reverse1(面向新手超详细)_第9张图片

别忘了我们的程序还没有分析完,继续往上分析

 BUUCTF-reverse-reverse1(面向新手超详细)_第10张图片

 for循环是对str2做了一个转换的处理,str2里面ascii码为111的字符会被转换为ascii码为48的字符,在IDA中,选中数字按"R"键可以将数字转换为字符。

BUUCTF-reverse-reverse1(面向新手超详细)_第11张图片

即str2中所有的"o"都被转换成了"0" 

所以flag为 flag{hell0_w0rld}

此题写的非常详细,初衷是最近想起了刚刚入门时候找遍wp都没有详细的,基础也很差,废了很大功夫才做出来一道题。于是就写了这样一篇面对基础的wp,以后也会持续更新buuctf及各平台的wp,不过没有这篇这么详细了。

点赞评论多的话后期会出一篇针对汇编代码的分析。

你可能感兴趣的:(BUUCTF,安全)