[网鼎杯 2020 青龙组]jocker

​1.初步分析 sp恢复平衡 得到假flag

 

 

 根据这里所谓的提示我们大概就能知道这里的flag就是假的,但是我们来试一下?

 

 v2是我们这里的值 我们可以shift+e或者右键如下

 

 然后在下面进行提取就好了

 非常明显的假flag

 我们从这里也可以看出来它把str传给了Destination但是并没有利用到Destination所以也没有什么意义,而真正在flag则藏在下面了

 点击encrypt发现有错误提示

 看到sp栈指针错误

 

勾选此单选框后

我们回到主函数处,按tab键转换为汇编窗口,往下翻找到call 指令部分,进行修复sp指针偏移值

 点击这个我们要修改栈帧的函数 改为0

再把这里改为0

修改后

不再提示说明已经修改完成了

2.开始动态调试 修复encryot() 得到一半flag

而此时我们仍然是进入不了encrypt(显示异常)

如果到最后都不能的话可能出现了加壳?我们进行动态调试看看

此时我们就需要利用前面的假flag进行omg函数的绕过(原来每一步都很有用?或者我们直接爆破哈哈)

flag{fak3_alw35_sp_me!!}

在此处设下断点并且断下来  然后点进去encrypt() 在这里下断点的原因是因为我们可以直接停在这里找

 显而易见从这里开始

 到这里结束就是我们所加的壳

 

 从定义头一直到endp,还有下方这一块区域,全部选中之后按u(undefined)取消定义,再在定义头按p即可识别为函数

 识别结果如图所示,然后F5就能够进行反编译了

 

提取数据

得到的flag是不完整的???

3.尝试寻求其他信息 利用ollydbg脱壳获取最后一个函数的信息(ida也可以但我实在不会了)

因此我们试着返回字符串寻找有效信息?

 非常明显的提示我们点进去看看(发现交叉引用不了。。。)

前面我们打好补丁后finally()就没有了???也许finally()也很奇怪,我们重新打开程序

 进入finally()

 真的太奇怪了

 发现又是这里的问题

将40159A~40159D处的数据全都转为代码,并将函数改为Undefine

 重新在40159A处创建函数,得到新函数finally()

此时我的ida实在不会了

用ollydbg进行脱壳

 找到函数的入口点 

 找到这个函数了

4.利用思维  写脚本 出flag

这个函数表示看不懂?但是flag最后一个是‘}’

而v3肯定是代表flag的最后五个符号

所以我们可以利用异或来求最后五个数

写脚本求出最后的flag

 

#include<iostream>
using namespace std;
int main()
{
unsigned int a[19] = {
    0x0000000E, 0x0000000D, 0x00000009, 0x00000006, 0x00000013, 0x00000005, 0x00000058, 0x00000056, 
    0x0000003E, 0x00000006, 0x0000000C, 0x0000003C, 0x0000001F, 0x00000057, 0x00000014, 0x0000006B, 
    0x00000057, 0x00000059, 0x0000000D
};
    char b[]={"hahahaha_do_you_find_me?"};
    for(int i=0;i<=18;i++)
    {
      printf("%c",a[i]^b[i]);
    }//%tp&:
    char c[]={'%','t','p','&',':'};
    int d=c[4]^'}';
    for(int i=0;i<5;i++)
    {
      printf("%c",d^c[i]);
    }


    
}

flag{d07abccf8a410cb37a}

posted @ 2023-11-28 01:22  wakappxc  阅读(72)  评论(1编辑  收藏  举报