码迷,mamicode.com
首页 > 其他好文 > 详细

【bugku】【RE】file WriteUp

时间:2018-12-15 19:52:33      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:运行程序   技术分享   接下来   for循环   并且   cst   encode   txt   打扰   

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啦!

【bugku】【RE】file WriteUp

标签:运行程序   技术分享   接下来   for循环   并且   cst   encode   txt   打扰   

原文地址:https://www.cnblogs.com/reddest/p/10124258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!