博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2015_NJUPT_CTF_Reverse300
阅读量:4660 次
发布时间:2019-06-09

本文共 5191 字,大约阅读时间需要 17 分钟。

今天到学校的线下CTF玩了一下,奥满教室的汉子心好碎T T

逆向只有两道题,一个apk的我就没看了,整理一下Reverse300的思路。

附件:  密码:2id4

1. 查看一下字符串,发现可疑字符串。

 

 

 

2.向上回溯,观察跳到这里的条件,经过图中两个断点处的跳转可以跳到可疑字符串,F9运行程序,断在第一个断点处,但跳转未实现,强制跳转一下。004016C9处也强制跳转一下。

 

 

 

 

 

 

 

 

 

3.程序来到了这里,这里是一个很关键的地方,我们记下这个地址00428c54,往下看就知道这里的关键了。

4.004018B8处强制跳转一下,004018DA处强制不跳转,00401930处的函数执行完后,00428c54处的内容变了,变成了一个32位字符串,小vi第一反应是个md5值。

5.接下来又来了一个新的字符串 "0kk`d1a`55k222k2a776jbfgd`06cjjb",并且在004019BB处解密,解密算法为取出该字符串的每个字符和"S"异或,将解密后的字符串放到0012F3F8处。

0040194E   .  BE 4C304200   mov esi,5631a3f0.0042304C                ;  ASCII "0kk`d1a`55k222k2a776jbfgd`06cjjb"00401953   .  8DBD 14FDFFFF lea edi,dword ptr ss:[ebp-0x2EC]00401959   .  F3:A5         rep movs dword ptr es:[edi],dword ptr ds>0040195B   .  A4            movs byte ptr es:[edi],byte ptr ds:[esi]0040195C   .  B9 37000000   mov ecx,0x3700401961   .  33C0          xor eax,eax00401963   .  8DBD 35FDFFFF lea edi,dword ptr ss:[ebp-0x2CB]00401969   .  F3:AB         rep stos dword ptr es:[edi]0040196B   .  66:AB         stos word ptr es:[edi]0040196D   .  AA            stos byte ptr es:[edi]0040196E   .  66:8B0D 48304>mov cx,word ptr ds:[0x423048]00401975   .  66:898D 08FDF>mov word ptr ss:[ebp-0x2F8],cx0040197C   .  8A15 4A304200 mov dl,byte ptr ds:[0x42304A]00401982   .  8895 0AFDFFFF mov byte ptr ss:[ebp-0x2F6],dl00401988   .  33C0          xor eax,eax0040198A   .  8985 0BFDFFFF mov dword ptr ss:[ebp-0x2F5],eax00401990   .  66:8985 0FFDF>mov word ptr ss:[ebp-0x2F1],ax00401997   .  8885 11FDFFFF mov byte ptr ss:[ebp-0x2EF],al0040199D   .  8D8D 14FDFFFF lea ecx,dword ptr ss:[ebp-0x2EC]004019A3   .  51            push ecx004019A4   .  E8 77080000   call 5631a3f0.00402220004019A9   .  83C4 04       add esp,0x4004019AC   .  50            push eax004019AD   .  8D95 14FDFFFF lea edx,dword ptr ss:[ebp-0x2EC]004019B3   .  52            push edx004019B4   .  8D85 08FDFFFF lea eax,dword ptr ss:[ebp-0x2F8]004019BA   .  50            push eax004019BB   .  E8 45F6FFFF   call 5631a3f0.00401005             ;此处为解密函数

解密后的字符串:

6.接下来将上面得到两个字符串传到函数0040E570中,这个函数中分别对比两个字符串,相等验证通过。

;验证函数0040E570  /$  55            push ebp0040E571  |.  8BEC          mov ebp,esp0040E573  |.  57            push edi0040E574  |.  56            push esi0040E575  |.  53            push ebx0040E576  |.  8B75 0C       mov esi,[arg.2]0040E579  |.  8B7D 08       mov edi,[arg.1]0040E57C  |.  8D05 44904200 lea eax,dword ptr ds:[0x429044]0040E582  |.  8378 08 00    cmp dword ptr ds:[eax+0x8],0x00040E586  |.  75 3B         jnz X5631a3f0.0040E5C30040E588  |.  B0 FF         mov al,0xFF0040E58A  |.  8BFF          mov edi,edi0040E58C  |>  0AC0          /or al,al0040E58E  |.  74 2E         |je X5631a3f0.0040E5BE0040E590  |.  8A06          |mov al,byte ptr ds:[esi]0040E592  |.  46            |inc esi0040E593  |.  8A27          |mov ah,byte ptr ds:[edi]0040E595  |.  47            |inc edi0040E596  |.  38C4          |cmp ah,al0040E598  |.^ 74 F2         |je X5631a3f0.0040E58C0040E59A  |.  2C 41         |sub al,0x410040E59C  |.  3C 1A         |cmp al,0x1A0040E59E  |.  1AC9          |sbb cl,cl0040E5A0  |.  80E1 20       |and cl,0x200040E5A3  |.  02C1          |add al,cl0040E5A5  |.  04 41         |add al,0x410040E5A7  |.  86E0          |xchg al,ah0040E5A9  |.  2C 41         |sub al,0x410040E5AB  |.  3C 1A         |cmp al,0x1A0040E5AD  |.  1AC9          |sbb cl,cl0040E5AF  |.  80E1 20       |and cl,0x200040E5B2  |.  02C1          |add al,cl0040E5B4  |.  04 41         |add al,0x410040E5B6  |.  38E0          |cmp al,ah0040E5B8  |.^ 74 D2         \je X5631a3f0.0040E58C0040E5BA  |.  1AC0          sbb al,al0040E5BC  |.  1C FF         sbb al,0xFF0040E5BE  |>  0FBEC0        movsx eax,al0040E5C1  |.  EB 34         jmp X5631a3f0.0040E5F70040E5C3  |>  B8 FF000000   mov eax,0xFF0040E5C8  |.  33DB          xor ebx,ebx0040E5CA  |.  8BFF          mov edi,edi0040E5CC  |>  0AC0          /or al,al0040E5CE  |.  74 27         |je X5631a3f0.0040E5F70040E5D0  |.  8A06          |mov al,byte ptr ds:[esi]0040E5D2  |.  46            |inc esi0040E5D3  |.  8A1F          |mov bl,byte ptr ds:[edi]0040E5D5  |.  47            |inc edi0040E5D6  |.  38D8          |cmp al,bl0040E5D8  |.^ 74 F2         |je X5631a3f0.0040E5CC0040E5DA  |.  50            |push eax0040E5DB  |.  53            |push ebx0040E5DC  |.  E8 2F000000   |call 5631a3f0.0040E6100040E5E1  |.  8BD8          |mov ebx,eax0040E5E3  |.  83C4 04       |add esp,0x40040E5E6  |.  E8 25000000   |call 5631a3f0.0040E6100040E5EB  |.  83C4 04       |add esp,0x40040E5EE  |.  38C3          |cmp bl,al0040E5F0  |.^ 74 DA         \je X5631a3f0.0040E5CC0040E5F2  |.  1BC0          sbb eax,eax0040E5F4  |.  83D8 FF       sbb eax,-0x10040E5F7  |>  5B            pop ebx0040E5F8  |.  5E            pop esi0040E5F9  |.  5F            pop edi0040E5FA  |.  C9            leave0040E5FB  \.  C3            retn

 

7.分析到这里,我们知道两个字符串中,"c8837b23ff8aaa8a2dde915473ce0991"是不变的,由程序给出的"0kk`d1a`55k222k2a776jbfgd`06cjjb"和"S"逐个异或得到,需要验证的是另外一个字符串,那么这个字符串是从哪里来的呢?回到该字符串出现的地方,再次分析一下,发现该值为计算00428c54处存放的数据的MD5值,嘿嘿预感是对的。这时候我们MD5解密一下"c8837b23ff8aaa8a2dde915473ce0991",解密后为"123321",重新跑一下程序,将00428c54改为"313233333231"(ascii"123321"),往下运行,果然出现了flag~

 

ps:后来来了一个妹子,比赛结束之后就消失了,还木有要个电话,T Tnozuonodie

转载于:https://www.cnblogs.com/Viwilla/p/4957160.html

你可能感兴趣的文章
下载文件的文件名之思考
查看>>
微信分享链接时怎样才能带上带缩略图和简介
查看>>
2019 年百度之星·程序设计大赛 - 复赛
查看>>
添加其它邮箱
查看>>
Fiji-imageJ 无法打开
查看>>
excel acm 高校排名(hdoj)
查看>>
给从论文复制的文本设置正确的格式(可设置快捷键)
查看>>
堆排序和优先队列
查看>>
非比较排序
查看>>
归并排序
查看>>
scrapy
查看>>
初学java 之 类型转化 笔记
查看>>
冒泡排序
查看>>
git使用系列 4.1 git 实践(一) pull的使用
查看>>
git 问题记录
查看>>
网站收集整理
查看>>
git使用系列 4.1 git 实践(二) push的使用
查看>>
CPU 上下文切换及案例分析
查看>>
Python 解析式、生成器
查看>>
js面向对象加构造函数模式表单验证
查看>>