freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

汇编入门你应该知道的知识
2020-06-23 13:53:20
所属地 湖南省

160个CrackMe-001

首先运行程序,发现程序是个注册机,输入用户名与注册码。

image.php?url=0Pg3wNkluz

"屏幕截图.png"

点击Check it Baby!会检测注册码是否正确,并且多次尝试发现提示语句相同

image.php?url=0Pg3wNKX2o

拉进OD进行分析,当弹出提示时不着急点确定,回到OD点击暂停运行按钮

image.php?url=0Pg3wN9T7p

点击堆栈(crlt+k)或者小图标K

image.php?url=0Pg3wN7jl6

找到地址为0042a1ae的MessageBoxA的函数,该函数为win32的弹窗函数,并且距离用户代码的入口点00401000非常接近

image.php?url=0Pg3wNvZ6M

右键->显示函数调用过程,观察那个函数调用了此函数,找到相关函数,可以发现这是MessageBox调用的过程,那么在堆栈区找到返回函数,观察该函数执行完会返回到哪个函数

image.php?url=0Pg3wN9NBm

打下断点,运行到此处,在右下角的堆栈窗口查看返回地址,在堆栈窗口中右键->地址->相对于EBP,找到EBP+4的地址,对应的地址为返回地址,右键该地址,反汇编窗口跟随

image.php?url=0Pg3wNr1l9

找到关键的跳转,该跳转会执行错误弹框信息。

image.php?url=0Pg3wNbbZ8

方法一:暴力破解

由于该跳转是用JNZ实现的,那么将跳转改为JE或者NOP掉改变程序的执行流程

image.php?url=0Pg3wNgPY6

(1)修改为JE,右键关键跳转语句->选择汇编

image.php?url=0Pg3wNNJoK

此时成功信息弹出

image.php?url=0Pg3wNCyrY

(2)用NOP填充,由于在关键的跳转语句下有个调用弹框函数,因此猜测该函数为成功的执行流。

右键关键跳转,选择NOP填充

image.php?url=0Pg3wNWGux

同样弹出成功消息

image.php?url=0Pg3wNnUdL

"屏幕截图.png"

方法二:注册机算法

发现在关键跳转前有个call调用,打下断点观察下寄存器的值

image.php?url=0Pg3wNd4QB

在执行到该调用语句时,观察右上角的寄存器窗口,发现了疑似注册码的值,以及我们手动输入的注册码,两者进行比较若不相同则直接跳转到错误弹窗。

image.php?url=0Pg3wNx1ub

将疑似注册码输入,发现成功弹窗,因此验证了这个就是注册码的值,那么在call语句实现之前则注册码已经生成

image.php?url=0Pg3wNJg16

0042FAF3的调用没有什么特殊的,跟进去0042FAE5的调用

image.php?url=0Pg3wNVsGd

(0042FAE5调用)汇编代码

此时可以看到,在进入0042FAE5调用之前,激活码已经生成完毕,在该函数调用只是进行了字符串的替换,将我们输入的name值分部分替换为激活码。

image.php?url=0Pg3wNNgAl

image.php?url=0Pg3wN9wx7

将断点断在函数的起始部分,单步跟踪查看

image.php?url=0Pg3wNmzsr

汇编代码部分

可以看到,程序会先计算name的长度,若长度小于4则直接弹出错误信息窗口。

程序会取出我们输入的name的第一个字节,这里简称为name[0]

将name[0]的值乘以0x29再乘以0x2即为部分注册码的值,例如我们输入的name为123456789,name[0]=1,这个1为字符串1,它的ASCII码值为0x31,则0x31*0x29*0x2 = 4018,通过刚刚的寄存器窗口可以看到我们的注册码为CW-4018-CRACKED,即中间数字部分的注册码已经求出

image.php?url=0Pg3wNel57

image.php?url=0Pg3wNyunu

通过输入不同的注册码,我们可以发现注册码的形式为CW-*****-CRACKED即只有中间部分的注册码是通过name值变换得来,而其他部分的注册码则是固定不变的,因此生成注册码的代码为,代码写的较为稀烂。

image.php?url=0Pg3wNh42Z

补充

当我们看到这些间接寻址时,可能因为代码太多已经忘记此时里面的值,可以点击数据窗口->Crtl+G输入你想看的地址,例如我输入了0x43176c则可以看到该段里面的值

image.php?url=0Pg3wNubQG

可以看到存储的值即我输入的name值012345678,这样可以随时查看段地址里存储的值,方便阅读汇编代码

image.php?url=0Pg3wNKQGv

总结

虽然程序不是十分复杂,但是可以帮助我们去熟悉OD的使用以及对汇编的应用,我也是通过该程序学到了很多,希望能够帮助到大家

参考链接

相关实验:

ARM漏洞利用技术五--堆溢出

https://www.hetianlab.com/expc.do?ec=ECIDf4f4-3f86-44b4-bd4c-e1c88520adde

本文系合天智汇原创,转载请注明出处。


# 互联网安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者