查看: 569|回复: 3

[Reverse] checkhex题解

[复制链接]

6

主题

39

帖子

2

精华

高级会员

Rank: 12Rank: 12Rank: 12

学币
533
荣耀
0
rank
2024
违规
0
发表于 2019-11-5 14:30:37 | 显示全部楼层 |阅读模式
本帖最后由 XD_GEIGEI 于 2019-11-5 14:33 编辑

这道题算是连蒙带猜吧,思路如下:
题目下载下来是个zip,解压出来
392125dc10f4da0c3d.png

1、打开试试功能,发现就是一个flag验证程序,其中发现关键字符串“show me your flag:",随便输一个字符串进去,显示另一个关键字符串”wrong flag!"
958985dc10fd8343f1.png

2、打开IDA,静态分析,快速定位关键代码,shift+F12打开字符串试图,第两个就是上述关键字符串
827715dc1102c8e56d.png

3、双击进去,然后查看交叉函数ctrl+x
473645dc1107761d5b.png
4、看到程序逻辑图,基本上就是经过几轮对比,与最后结果相同即为flag,,,F5大法反编译
205695dc110a917450.png
160445dc110d923ed3.png

5、分析之后,程序的逻辑也不复杂,第一部分说明需要输入一个39位的字符串,且该字符串必须是flag{}的形式
300435dc1118be6a85.png

6、第二部分做了两个判断,(这里要说明一下SLOBYTE和SHIBYTE这两个函数,SLOBYTE意思是取低8位,SHIBYTE意思是取高8位)
48725dc112bfb6be2.png

看一下checkbox,双击点进去,然后shift+E导出数据
195645dc112f886544.png
9、明白了逻辑可以写逆向程序了
#include <stdio.h>
#include <windows.h>


int char2hex(char a)  //实现char2hex功能
{
  if (a<=57 && a>47)
                    return a-48;
            if (a>102 || a<=96)
                    return -1;
                   return a-87;
    }
int main() {
        int _checkbox[16] =
        { 173, 70, 30, 32, 60, 121, 117, 179, 94, 82, 121, 96, 203, 254, 176, 108 };
        int i,j;
        for(i=0;i<=15;i++){
                for(j=0;j<=0xFFFFFFFF;j++){  //这里直接用爆破的思路,计算每一个可以符合条件的数
                        int a,b;
                        a = char2hex(LOBYTE(j));
                        b = char2hex(HIBYTE(j));
                        if(a != -1 && b!= -1){
                                int c;
                                c = 16*a+b;
                                if(c == _checkbox[i]){
                                        printf("%x",j);
                                        break;
                                }        
                        }
                }
        }
}
10、输出一大串数字明显太长,直接16进制转text,转完一数刚好32位(da64e102c397573be5259706bcef0bc6),加上flag{},39位,输入试了一下还不对,但是应该离答案很近了
739595dc1142643ce8.png

11、静态调试完还没得到flag,就上动态调试呗(这里可能也是因为我比较菜,等结束看看其他大神的wp)一路F8,都没问题,到如图这一步发现问题了,标黄这一行是关键的判断语句,对应静态分析里v9与checkbox那一条判断语句,可以看到如果相等就会跳转到地址004016A0进行下一次循环,看看此时寄存器里的内容(下方框框),可以看到[esp+3C]里的数据和eax中的数据不相等,而且是相互交换位置的,尝试调换一下位置输入(原来为da64e102c397573be5259706bcef0bc6,改成ad461e203c7975b35e527960cbfeb06c,注意这里两两互换位置),输入一下,成功,flag{ad461e203c7975b35e527960cbfeb06c}
529255dc114fd3a19c.png
909255dc116fff198b.png

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
你白给的样子真的很靓仔

6

主题

39

帖子

2

精华

高级会员

Rank: 12Rank: 12Rank: 12

学币
533
荣耀
0
rank
2024
违规
0
 楼主| 发表于 2019-11-5 14:35:09 | 显示全部楼层
这道题最后为什么要调换位置我猜可能跟汇编里出入内存的顺序有关,对这块不是很熟,动态分析一步一步笨办法过来的,有大神可以解答下

点评

回味了一下,怎么感觉flag这么眼熟呢[attachimg]1963[/attachimg] checkbox就是flag,简单问题复杂化了。不过练了练许久不用的C语言也算不亏吧。  详情 回复 发表于 2019-11-5 15:30
你白给的样子真的很靓仔

6

主题

39

帖子

2

精华

高级会员

Rank: 12Rank: 12Rank: 12

学币
533
荣耀
0
rank
2024
违规
0
 楼主| 发表于 2019-11-5 15:30:03 | 显示全部楼层
XD_GEIGEI 发表于 2019-11-5 14:35
这道题最后为什么要调换位置我猜可能跟汇编里出入内存的顺序有关,对这块不是很熟,动态分析一步一步笨办法 ...

回味了一下,怎么感觉flag这么眼熟呢
677865dc124b358a82.png
checkbox就是flag,简单问题复杂化了。不过练了练许久不用的C语言也算不亏吧。

你白给的样子真的很靓仔
发表于 2019-11-8 14:50:16 | 显示全部楼层
XD_GEIGEI 发表于 2019-11-5 14:35
这道题最后为什么要调换位置我猜可能跟汇编里出入内存的顺序有关,对这块不是很熟,动态分析一步一步笨办法 ...

有时候高级语言转换成汇编的时候会绕路~但是每个操作都有理论支撑的
论坛交流群:672619046
微信公众号
快速回复 返回顶部 返回列表