算法分析:BUUCTF-2019全国赛的一道逆向题

1.对程序进行查壳,发现是个无壳vc编译的

2.运行程序,查看程序运行流程,在password中输入12345678,按下Crack按钮以后没有任何提示程序结束运行

3.依旧先让od跑一遍,以前说过的这种通过用户输入然后再按下按钮触发事件的先对GetDlgItemTextA函数断点看程序是否是用这个函数从输入框获取用户输入的

在输入框输入12345678按下Crack按钮后成功在GetDlgItemTextA函数断下,由于我们的断点是GetDlgItemTextA函数的入口点,属于系统领空,所以我们直接往下找到离GetDlgItemTextA函数入口点最近的retn断点跑完GetDlgItemTextA这个函数去查看按钮的其他逻辑事件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLLlOf4Y-1693020800919)(https://image.3001.net/images/20220413/1649837682_625686729ee5ddcf8d643.png!small)]

4.查看按钮其他逻辑事件

跑完GetDlgItemTextA函数后发现往下有一个ExitProcess的函数,这让我们联想到了我们正常运行程序时候输入12345678程序结束运行,那可以肯定这个函数就是在我们输入12345678按下Crack按钮触发的,从这个函数往上看发现在这个函数之前有个jbe跳转,点击一看,如果跳转便是跳过这个ExitProcess的执行,说明这个jbe时一个关键点,那我们对jbe这个跳转的条件
cmp eax,0x6进行断点分析

jbe的条件是对比eax的值是否小于等于0x6,如果满足则就跳过退出程序函数,我们一看eax的值便是我们输入12345678的长度,那我们重新输入六个数123456作为用户输入的值运行到这里

果然,eax此时确实是用户输入的长度,而且jbe跳过了退出,ecx存入了我们输入的123456,但是是以字符串形式存入(这里要注意,后面会用到)那我们继续走跳过退出后的代码

经过这个函数后,eax的值变为了0x1e240,我们在看这个call的参数只有一个ecx,那在这个call之前我们知道ecx的值是字符串‘’123456“的地址,那说明这个0x1e240和这个123456有关系,一个是字符串一个是十六进制,这个我们就可以猜想是否这个0x1e240是”123456“转换的十六进制数,那我们用代码验证一下

#include

​ int main()

​ {

​ char num[6] = “123456”;

​ int last = atol(num);

​ printf(“%x”,last);

​ }

果然,我们的猜想是正确的,那继续往下走

这几行代码将eax的值赋值给了edx,而且edx还加1,此时还出现了一个对比jnz跳转,跳转的条件是edx的值是否等于0x7b,不等于则跳转,我测试了一下跳转后的流程是重复执行获取用户输入,所以我们为了不结束程序则要使得edx等于0x7b,也就是说需要eax+1
= 0x7b,我们刚才分析过eax是我们输入字符串的转16进制数,那我们此时可以得知eax=0x7b-1 =
(字符转十六进制数)用户输入,最后可以用代码算出我们要输入什么,这里要强调一个问题,从对GetDlgItemTextA断点以来,我们输入的变化情况:123456(整数)->”123456“(字符串)->0x1e240(十六进制数),其实我们输入的就是经历了两个函数itoa->atol;所以这里我们可以直接得知我们输入要满足其等于0x7b-1,所以就是数字122,那我们从新程序断点在上图这个cmp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nMO82Fyi-1693020800928)(https://image.3001.net/images/20220413/1649837686_625686766dd9e1776c0d1.png!small)]

此时,下面又出现了三个接连的对比,分别是地址ss:[ebp-0x101]、ss:[ebp-0xFF]、ss:[ebp-0x100]的值分别和0x78、0x7a、0x79对比,这三个jnz经过测试都是跳转到重复执行获取用户输入和这一系列的判断,那此时我们来分析这三个地址的特殊性,发现我们刚才输入那三个数122的地址是ss:[ebp-0x108],第一个地址在122地址往后3个字节,第二个地址在122地址往后1个字节,第三个地址在122地址往后2个字节,那这三个地址的值到底来自哪里呢?我们知道这个Crake的第一个要求便是用户输入的值小于等于6,说明我们可以输入6个长度的任意字符,那剩下的这三个字节加上122的长度刚好是六个。那还不简单?直接找出这三个不满足jnz跳转的值是多少就行了

条件:
ss:[ebp-0x101] =0x78 字符:z
ss:[ebp-0xFF] = 0x7a 字符:x
ss:[ebp-0x100] = 0x79 字符:y
按位置排序出来便是xyz,那我们重新打开输入122xyz断点最后一个jnz

5.运行到这里看到了flag字符,估计接下来就是出现flag的时候了,继续单步执行到正确flag提示信息出现前是这些代码,由于没有什么算法存在,这些代码知识用来拼接flag的所以就不分析了

004011E4 . A1 A02F4200 mov eax,dword ptr ds:[0x422FA0] ;
flag

004011E9 . 8985 F4FDFFFF mov dword ptr ss:[ebp-0x20C],eax

004011EF . 8A0D A42F4200 mov cl,byte ptr ds:[0x422FA4]

004011F5 . 888D F8FDFFFF mov byte ptr ss:[ebp-0x208],cl

004011FB . B9 3F000000 mov ecx,0x3F

00401200 . 33C0 xor eax,eax

00401202 . 8DBD F9FDFFFF lea edi,dword ptr ss:[ebp-0x207]

00401208 . F3:AB rep stos dword ptr es:[edi]

0040120A . 66:AB stos word ptr es:[edi]

0040120C . AA stos byte ptr es:[edi]

0040120D . 6A 0A push 0xA ; /Arg3 =
0000000A

0040120F . 8D95 F0FCFFFF lea edx,dword ptr ss:[ebp-0x310]
; |

00401215 . 52 push edx ; |Arg2 =
00000079

00401216 . 8B85 F8FEFFFF mov eax,dword ptr ss:[ebp-0x108]
; |

0040121C . 50 push eax ; |Arg1 =
00000078

0040121D . E8 9E290000 call 1.00403BC0 ;
\1.00403BC0

00401222 . 83C4 0C add esp,0xC

00401225 . 68 44204200 push 1.00422044 ; {

0040122A . 8D8D F4FDFFFF lea ecx,dword ptr ss:[ebp-0x20C]

00401230 . 51 push ecx

00401231 . E8 3A020000 call 1.00401470

00401236 . 83C4 08 add esp,0x8

00401239 . 8D95 F0FCFFFF lea edx,dword ptr ss:[ebp-0x310]

0040123F . 52 push edx

00401240 . 8D85 F4FDFFFF lea eax,dword ptr ss:[ebp-0x20C]

00401246 . 50 push eax

00401247 . E8 24020000 call 1.00401470

0040124C . 83C4 08 add esp,0x8

0040124F . 68 40204200 push 1.00422040 ; _

00401254 . 8D8D F4FDFFFF lea ecx,dword ptr ss:[ebp-0x20C]

0040125A . 51 push ecx

0040125B . E8 10020000 call 1.00401470

00401260 . 83C4 08 add esp,0x8

00401263 . 68 2C204200 push 1.0042202C ;
Buff3r_0v3rf|0w

00401268 . 8D95 F4FDFFFF lea edx,dword ptr ss:[ebp-0x20C]

0040126E . 52 push edx

0040126F . E8 FC010000 call 1.00401470

00401274 . 83C4 08 add esp,0x8

00401277 . 68 28204200 push 1.00422028 ; }

0040127C . 8D85 F4FDFFFF lea eax,dword ptr ss:[ebp-0x20C]

00401282 . 50 push eax

00401283 . E8 E8010000 call 1.00401470

ok了,最后的信息框提示了flag

-0x20C]

00401282 . 50 push eax

00401283 . E8 E8010000 call 1.00401470

[外链图片转存中…(img-rGLNigrP-1693020800931)]ok了,最后的信息框提示了flag

学习网络安全技术的方法无非三种:

第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。

第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

第三种就是去找培训。

image.png

接下来,我会教你零基础入门快速入门上手网络安全。

网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。

第一阶段:基础准备 4周~6周

这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
image.png

第二阶段:web渗透

学习基础 时间:1周 ~ 2周:

① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
image.png

配置渗透环境 时间:3周 ~ 4周:

① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。

渗透实战操作 时间:约6周:

① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
image.png
以上就是入门阶段

第三阶段:进阶

已经入门并且找到工作之后又该怎么进阶?详情看下图
image.png

给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值