2018河北省赛部分writeup(re)

kee1ong

前言

因为最近在学习binary,来拿几道练练手,感觉比国赛简单多了(希望今年也这样…)。大多都是工具的基础使用。
写了re部分的wp,如有错误和更简单的解法欢迎大师傅们指点。

0x01 有点简单的逆向(12)

打开附件,先拖进Exeninfo看看是什么类型。是一个32bit的ELF。
clipboard.png

所以拖进ida32,找到main函数,F5一下获得反汇编后的结果。

clipboard.png

分析一下,程序用memset开辟了几个连续的内存空间(可以认为是数组)v3,v4,v5.然后开始赋值。
一开始很懵。后来发现,问题在于赋的值真的只是数字吗?我们知道即使是字符串,在内存空间中存储也是以数(ascii)的形式表示的。
所以我们点一下v3第一块空间的值,按R(转为字符)看看有什么结果。
clipboard.png
果不其然,GALF。看来程序实现的是一个反转字符串的功能。直接把剩下的变量全转为字符。获得flag。
clipboard.png

FLAG-4092849uio2jfklsj4kl

(这是逆向题?)

0x02 磁盘取证(13)

无语的题目。
拿到附件,首先发现他不是一个可执行文件。扔进ida显示是一个二进制文件。也无法反汇编。从题目得知应该是一个内存取证的题目(用linux挂载啥的,还没太接触过)。
然后无语的地方出现了,用ida按下shift+F12(查看字符串)。其中发现了:
clipboard.png
行吧。(看来挂载之后,也是去找mnt/test/Flag.txt就可以获得flag了)

flag{yc4pl0fvjs2k1t7T}

0x03 crackme(17)

严格意义上的第一道逆向题。首先先分析:
clipboard.png
一个win32程序。运行一下看看:
clipboard.png
看来是要找出正确的输入内容是什么了,先用ida看下:
clipboard.png
517个函数,附带一个鬼畜的main函数反汇编结果:
clipboard.png
字符串查找也没有结果。静态调试怕是要看死了,考虑用od动态调试。
先扔进od中,查看参考文本字符串,发现了输入提示语:
clipboard.png
双击,找到了在程序中对应的位置。按下F2下断点:
clipboard.png
运行程序到断点处。这里随便输入数据(111111),继续执行程序:
clipboard.png
按F8步进,注意观察寄存器中内容的变化。终于发现步进到某个函数时,我们刚才输入的数据被放进了ecx寄存器中:
clipboard.png
继续F8,可以看到不远处,有一条指令将main函数放入了eax寄存器中:
clipboard.png
依旧F8,就可以发现些眉目了。
首先,程序取出了main的首字母m,与输入数据的头位1,分别放到cl与al中:
clipboard.png
clipboard.png
之后将两者进行异或运算,保存在al中:
clipboard.png
可以看到结果是"":
clipboard.png
接着步进,可以看到程序往eax寄存中放入了一串疑似base64编码的字符串:
clipboard.png
同时我们可以看到,刚才输入的11111已经变成了"11111":
clipboard.png
继续步进,程序jb到了前面的内存地址,看来是一个循环:
clipboard.png
所以我们一路F8,看看这回cl与al中都放入了什么,可以看到cl中放入了a,al中放入了:
clipboard.png
clipboard.png
两者异或,和刚才的操作类似,这回得到了'=':
clipboard.png
clipboard.png
继续F8下去,可以发现程序的逻辑是:将输入数据的每位与main的每位分别异或
例如我们输入了11111,那么第一位1会先与m异或得到符号,符号在与a异或得到=符号……直到最后一次异或运算得到了:符号,
接下来程序从刚才输入数据的第二位1开始,继续上述操作,最后结果也得到了:符号。
如果跑完整个流程,我们输入的111111应该变成了:::::
见图,第二位运算完成后的结果如下:
clipboard.png
最终结果如下:
clipboard.png
这之后程序跳出了循环,继续F8,可以发现程序又在eax中放入了一串疑似base64的字符串:
clipboard.png
再往后就回到了try again了:
clipboard.png
这串base64可以在参考文本字符串中看到:
clipboard.png
解码后结果为:mgjlpO8F?Ts:R?T|?Ex^Bv

所以程序的逻辑大概可以猜测出来了:输入一串字符,将其每位与main每位分别异或,最后与串mgjlpO8F?Ts:R?T|?Ex^Bv对比,若不同则Try again
那么我们可以自己写一个exp:把mgjlpO8F?Ts:R?T|?Ex^Bv每位与niam每位分别异或,就可以得到我们一开始应该输入的串

exp没啥难度,基本字符串操作,直接上代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char s1[100]="mgjlpO8F?Ts:R?T|?Ex^Bv";
    char s2[100]="niam";
    int i,j;
    for(i=0;i<strlen(s1);i++)
        for(j=0;j<strlen(s2);j++)
        {
            s1[i] = s1[i] ^ s2[j];
        }
    puts(s1);
    return 0;
}

得到结果,看上去是个flag格式。

clipboard.png

输入原程序中看看结果:
clipboard.png
success,得解:

flag{D3M4_x1Y4_w4NsUI}

省赛的逆向题目貌似就这些了,还是比较基础的。希望能帮到大家。
顺便吐槽一下网络安全大赛居然没有Web题……

阅读 1.6k
1 声望
1 粉丝
0 条评论
1 声望
1 粉丝
文章目录
宣传栏