zoukankan      html  css  js  c++  java
  • 【bugku】【RE】file WriteUp

    FILE

      查壳后显示无壳,拖进IDA:

      运行程序时传递的第一个参数为一个文件名,并打开该文件。下面点进去encode函数分析一下:

      for循环中每三个为一组,进行Base64的操作,接下来两个if分别判断Base64后的尾部是加一个“=”还是两个“=”还是不加“=”。具体Base64编码方式可以参考我的这篇博客:https://www.cnblogs.com/reddest/p/9554948.html。所以encode()是对传入的字符串进行Base64编码。回到主函数看看encode()被用在哪里了:

      圈出来的部分就是判断输入的数据是否是正确的KEY了,并且可以发现并没有用到encode()的返回值v11和v12,所以encode()就是个摆在那里打扰分析思路的。老夫40米巨剑何在。

      根据异或的可逆性,v14[k] = k ^ flllag[k] ^ v13[k]。现在我们只缺v13数组中是哪些元素了,分析sub_400EB9():

      sub_400EB9()的返回值根据sub_400E6A()来定,跟进分析sub_400E6A():

      这里把传入的某个元素判断是否符合某个区间,然后分别返回不同的值。该函数传进来的是sttr_home[]字符串中的元素,主函数中双击该字符串:

      获取了sttr_home的元素后写个脚本跑出v13[],脚本如下:

     1 #include <cstdio>
     2 char str[110] = "664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643";
     3 int jdg(int id){
     4     if(str[id] >= '0' && str[id] <= '9')
     5         return str[id] - '0';
     6     if(str[id] >= 'A' && str[id] <= 'F')
     7         return str[id] - '7';
     8     if(str[id] < 'a' && str[id] > 'f')
     9         return 0xFFFFFFFFLL;
    10     return str[id] - 'W';
    11 }
    12 int calc(int x, int y){
    13     return 16 * jdg(x) + jdg(y);
    14 }
    15 int main(){
    16     for(int i = 0;i < 64;i += 2){
    17         printf("%d, ", calc(i, i + 1));
    18     }
    19     return 0;
    20 }

      接着写出根据v14[k] = k ^ flllag[k] ^ v13[k]写出相应脚本跑出KEY,并把KEY存到文件中,代码如下:

      接着用gcc编译并运行后,把a.txt作为参数传给file运行:

      把a.txt的MD5在线计算一下:

      把MD5加上flag{}就OKK啦!

  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/reddest/p/10124258.html
Copyright © 2011-2022 走看看