【buuctf】 每日四到(reverse)

easyre1

本人今天才开始学的逆向,汇编上课也没咋听,师傅们请点喷

题目下载文件,拖进IDA,然后可以直接看到汇编源码了

f1cf880de1804c029c5ceca8b5f61584.png

 

 

按f5就能看到源码了,直接看c语言代码

17bccf13a04546d19dbf78734c263aa9.png

 

 直接把flag{this_Is_a_EaSyRe}交上去就行了

reverse1

下载程序,只看见一个程序

da92bb858063473bab9ea1be4a9b6324.png

 

直接在IDA打开(要查壳的后面遇到再说吧,现在还在学习)

 点开没有发现main函数,这是有一个思路就是看看string视图(我这的话views里头有个open subviews里头就有)

 

f242e09b3d81479382b84c69e5015586.png

 

 

搁着呢

 发现有个提示字符串点开看看

3557a2f5b6ff47ee9ca1a959472812e4.png

 

看见了比较有用的东西  

 

0fdaf817ae6244ebbca01d5bf955938e.png

db在汇编语言里面是一个在内存分配一个或多个字节空间的指令,可以用来定义字符串,在这里意思是,定义一个名为 aInputTheFlag 的字节数组,并将字符串 'input the flag:' 存储在该数组中,末尾以 0 作为字符串的结束符(也就是我们熟悉的c语言里头/0作为字符串的末尾)

之后我们双击这个aInputTheFlag变量,按x跳到引用该变量的程序,查看汇编程序和伪代码

a732d7f35bba475281e65d3b6f46b356.png

 

7b5680f397cf4b20b61d59ed3b605738.png

 

看伪代码,可知它要我们输入str1,然后利用strncmp()函数和str2进行比较

前提知识:int strncmp(const char *str1, const char *str2, size_t n);

str1,str2为比较的两个函数,n表示要比较的长度,当返回值为:

<0        str1<str2

=0        str1=str2

>0        str1>str2

是在不行就看成str1-str2吧(按字典比较的,字符串比较是比较基础的知识了),因此题目里头就是要str1=str2才能猜对flag

这下问题变为这个str2的值为什么?

继续查看str2的信息,发现

23434f281f514429b1e81210d9c8914c.png

 

 lea rcx, Str2      ; "{hello_world}"

这个代码就是把Str2的地址(不是str2字符串内容哈)加载到寄存器rcx里头,后面有个注释{hello_world},怀疑就是str2的值,然后继续在string视图里头看{hello_world}这个字符串,发现

9d87cc799ee043c69f0e76e8a1dfb3af.png

 

 直接确定了,但是伪代码里头还有一段对str2处理的代码,这里审计一下(在IDA里头我们可以把ascii数字引住然后按r,这样就会变成字符了)

  for ( j = 0; ; ++j )
  {
    v8 = j;    //v8记录当前枚举到的字符串位置
    v2 = j_strlen(Str2); //v2记录字符串的长度
    if ( v8 > v2 ) //当v8超过v2时结束循环,说白了就是遍历字符串!!
      break;
    if ( Str2[j] == 111 )//当str2里头出现ascii值为111的字符,即遇到'o',我们就把它改成'0'
      Str2[j] = 48;        
  }

总的来说就是把字符串里头的'o'改为‘0’ 

 因此,我们就得到了flag:

flag{hell0_w0rld}

reverse2

和上一题一样,也是要你输入一个字符串,然后让你输入的字符串和修改过的flag进行比较(上面那个函数好像是和操作系统有关的,也不懂他是啥,不重要)

fb369534c1e140b3bce361313a69e28c.png

 

此时我们的任务就是找到这个flag变量了,要看看flag变量储存的是什么字符串

对flag双击,找到定义flag的汇编程序片段

0f97f789b0114e10a3b1efef75d123cb.png

 这里往flag赋值了'{' ,往aHackingForFun赋值了'hacking_for_fun}’,这里我查了一下(如有错误,请师傅们指正)虽然flag和aHackingForFun是两个不同的变量,但是地址相邻(一个0x601080一个0x601081)程序在处理的时候可能会组合这两个数据(也就是读取flag的时候也会将后面的aHackingForFun连起来形成{hacking_for_fun})

然后我们看一下c语言里头处理flag的部分(将ascii编码的数字引用按r得到字符原型)

 for ( i = 0; i <= strlen(&flag); ++i )
    {
      if ( *(&flag + i) == 'i' || *(&flag + i) == 'r' )
        *(&flag + i) = '1';
    }

 说白了就是遍历字符串,将字符串里头的'i'和'r'变成'1' (c语言在逆向是基础!)

综上所述,得到payload

flag{hack1ng_fo1_fun}

内涵的软件

这里拖到IDA直接看到汇编源码里头有个奇怪的字符串了,盲猜就是flag

05ec048dcfea486facff4b5a0124f427.png

 

 交上去就是了,但是我这个IDA按f5打不开这个源码也不到为啥到时候有时间再看看吧

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值