当前位置:首页 > 每日看点 > 正文内容

有一个exe程序,如何快速逆向到源码并自己写一个?

卡卷网12个月前 (01-07)每日看点174

此次2024年杯资格赛涉及到的程序逆向不是恶意程序,所以可以直接在机上运行。看了一些解题思路写得不详细,今再拿起复盘顺便做个记录,素材及软件链接在文末。

1.在U盘中,你还发现了一个exe文件,但它被锁定,可能需要进行反编译以便进一步检查。

参考Did_U_8G.e01,使用x64dg的字符串搜索(StringSearch)功能,在itlocker.exe中查找哪个字符串最有可能与显示的登录状态有关?

A:Welcome;

:Invalidinput;

C:LoginSuccesul!;

D:AccessDenied

答案:C

步骤:

1.使用IDA软件打开itlocker.exe

点击File-Open选择itlocker.exe

题干当中提示的是字符串,我们在这时显示程序中出现的字符串可以使用快捷键shift+F12显示出来,也可在视图(view)->打开子视图(opensuviews)->字符串视图(strings)

2.承上題,当找到控制登录成功的逻辑代码时,如何修改汇编代码(AssemlyCode)来绕过检查,达到任意输入,都成功登录的效果?

A:修改CMP指令,使其总是较相等;

:修改CMP指令後的跳转指令JNE為nop,使跳转指令失效;

C:修改MOV指令,使其移动错误的数据;

D:修改指令後的跳转指令JNE為nop,使跳转指令失效

答案:

定位到该为止使用ctrl+x进行交叉引用,定位该代码的位置

步骤:

上图在该位置进行双击,跳转到下图后按ctrl+x进行跳转

leardx,String;"LoginSuccesul!"movrcx,:qword_140008768;hWndcall:SetWindowTextAmovzxeax,:yte_14000808Ceax,eaxjnzshortloc_1400020C5

<>代码功能概述

这段代码看起来像是在Windows环境下(基于调用了SetWindowTextA函数来推测)执行的一段汇编代码片段,其主要目的可能是根据某个条件来设置窗口的文本内容,并且后续进行了一个条件判断。

<>指令分析

1.leardx,String;"LoginSuccesul!"

1.lea(LoadEffectiveAddress)指令在这里用于将String的有效加载到rdx寄存器中。从注释来看,String大概率指向一个字符串常量"LoginSuccesul!",意味着后续可能会用这个字符串作为参数传递给相关函数(在这里就是SetWindowTextA)去设置窗口显示的文本内容。

2.movrcx,:qword_140008768;hWnd

1.mov指令用于数据传送,这里是把段选择符为(代码段)中偏移为140008768处的一个64位(qword)数据传送到rcx寄存器中。从注释hWnd推测,这个处存放的应该是一个窗口句柄(hWnd),而在WindowsAPI中,很多函数都需要窗口句柄作为参数来指定作的目标窗口,SetWindowTextA就是其中之一,它会对由该句柄指定的窗口进行文本设置作。

3.call:SetWindowTextA

1.call指令用于调用函数,这里调用的是位于代码段()中的SetWindowTextA函数,并且通过前面两条指令已经将函数所需要的两个关键参数准备好了,分别放在rcx(窗口句柄hWnd)和rdx(要设置的字符串"LoginSuccesul!")寄存器中。SetWindowTextA函数的作用就是改变指定窗口的标题栏文本或者窗口内文本内容(取决于窗口类型等因素)。

4.movzxeax,:yte_14000808C

1.movzx指令是零扩展传送指令,它会将指定内存位置(这里是代码段中偏移为14000808C处的字节数据)传送到eax寄存器中,并将高字节(因为eax是32位寄存器,而源作数是字节)用零进行扩展填充。

5.eax,eax

1.指令用于执行逻辑与作,但不保存结果,只根据结果设置标志位(如ZF零标志位等)。在这里它对eax寄存器自身进行逻辑与作,实际目的通常是用来检查eax寄存器的值是否为零。例如,如果eax为零,那么ZF(零标志位)会被置1;如果eax不为零,ZF则为0

6.jnzshortloc_1400020C5

1.jnz(JumpifNotZero)是条件跳转指令,它会根据前面指令设置的标志位情况来决定是否跳转。如果ZF标志位为0(即eax不为零),那么程序就会跳转到偏移为1400020C5的位置(标记为loc_1400020C5处)继续执行后续代码;如果ZF1(即eax等于零),则会按顺序执行紧跟在这条指令后面的代码(前提是没有跳转等改变执行流程的情况出现)。

总体而言,这段代码先是尝试设置窗口文本内容,然后检查一个字节变量的值,根据其是否为零来决定下一步的执行流程(跳转到指定位置或者顺序执行后续代码)。具体完整的功能还需要结合更多的上下文代码以及程序的整体逻辑来综合判断。

3.参考Did_U_8G.e01,itlocker.exe的正确用户登录名称是?

答案:did1337

步骤:上述是判断是否登录成功的流程图,所以往上看可以看到其登录逻辑,

通过上一题定位到判断成功失败的位置,在IDA中可以看到该位置前面的流程图存在两个字符串,使用字符串:”did1337”作为用户登入名称,字符串:”1337did”作为登入密码进行登入,提示LoginSuccesul!。

通过lea指令获取String的和一个字符串常量"did1337"

4.参考Did_U_8G.e01,itlocker.exe的正确登录密码是?

答案:1337did

步骤:如上题。

5.参考Did_U_8G.e01,当itlocker.exe程序尝试显示登录结果(成功或失败)时,使用了哪一种途径来决定显示的消息?

A:通过检查某个寄存器的值来决定跳转到不同的汇编代码区段;

:通过调用硬编码的内存来显示特定的消息框;

C:通过堆栈中的返回来确定要显示的消息;

D:通过逐位作来修改显示消息的字符串内容

答案:A

解题思路:见第二题题解。

6.参考Did_U_8G.e01,决定能否解密itlockerKey的字节的内存偏移量(MemoryOffset)(相对于基址"itlocker.exe")是什么?

A:0xA02;

:0x808C;

C:0xA0C8;

D:0xA0E0

解题步骤:

{

SetWindowTextA(qword_140008768,"LoginSuccesul!");

if(!yte_14000808C)

MessageoxA(

0i64,

"Great!Youhefinishedthefirststep.Keepgoingtofindtheitlockerkey.",

"loginsuccesul",

0);

if(yte_14000808C)

{

su_1400022A0(v24,v23,v22);

v10=(constCHAR*)su_1400029E0(v24);

MessageoxA(0i64,v10,"TheitlockerKey",0);

su_14000240(v24);

}

}

su_14000240(v25);

su_140002790(v22);

retnsu_140002790(v23);

}

(“14000”为当前基址,所以选项表述0x808C)

1.if(!yte_14000808C)<>及相关MessageoxA<>调用

1.首先进行了一个条件判断,检查yte_14000808C的值是否为零(通过!取反作来判断其是否为假,即值为零)。如果yte_14000808C的值为零,就会执行下面的MessageoxA函数调用。

2.MessageoxA函数同样是WindowsAPI函数,用于弹出一个消息框与用户进行交互。这里弹出的消息框标题为"loginsuccesul",内容为"Great!Youhefinishedthefirststep.Keepgoingtofindtheitlockerkey.",并且父窗口句柄参数设置为0i64(可能表示无父窗口或者是基于特定的默认设置),最后一个参数0可能是用于指定消息框的样式等相关属性(具体取决于MessageoxA函数的参数定义和使用约定)。这个消息框主要是向用户提示已经完成了第一步作,并鼓励继续去查找itlocker密钥相关内容。

2.if(yte_14000808C)<>及相关函数调用

1.当yte_14000808C的值不为零(即条件判断为)时,会依次执行以下作:

1.su_1400022A0(v24,v23,v22);:调用自定义的函数su_1400022A0,并传入v24v23v22这几个参数,具体该函数的功能取决于其内部实现,从上下文推测可能是为了后续获取itlocker密钥等作做准备工作。

2.v10=(constCHAR*)su_1400029E0(v24);:调用su_1400029E0函数,传入v24参数,并且将返回值强制转换为constCHAR*类型后赋值给v10。这个函数很可能是用于获取itlocker密钥相关的字符串表示或者关键信息,返回的结果后续会作为参数传递给MessageoxA函数。

3.MessageoxA(0i64,v10,"TheitlockerKey",0);:再次调用MessageoxA函数,弹出一个标题为"TheitlockerKey"的消息框,消息框的内容则是由前面获取到的v10所指向的字符串(也就是su_1400029E0函数返回的内容),同样父窗口句柄参数为0i64,最后一个参数为0用于指定消息框样式等属性。这个消息框用于向用户展示获取到的itlocker密钥相关信息。

4.su_14000240(v24);:调用su_14000240函数,传入v24参数,其功能可能是对之前使用的相关数据进行清理、释放资源或者进行与业务逻辑相关的后置处理作。

或者使用alt+t快捷键进行搜索只有808C能够被搜索到

7.参考Did_U_8G.e01,决定能否解密itlockerKey的内存偏移量(MemoryOffset)后,应该如何利用它来进行解密?

A:将该偏移量处的值改为1(true),以启用解密过程;

:将该偏移量处的值改为0(false),以重新初始化加密过程;

C:将该偏移量的内容保存到档中以作解密过程中的key;

D:清空该偏移量的内存并强制退出程序

答案:A

解题思路:

逆向注入,把yte_14000808C值改为1,然后输入密码,解析出来。

这题需要用ida软件和x64deug软件结合

大致的步骤是将ida的基址改为与x64deug的基址一,为的是方便定位在x64deug当中的位置,然后将值进行修改。

1.将ida的基址进行修改

在x64dug软件中选择“符号”,选择itlocker.exe复制基址

在ida中修改与其相同的基址

点击ok即可

修改完成后再按F5键显示C伪代码

接下来在x64deug当中跳转到该。或者按快捷键ctrl+G

因为是yte类型,将其值改为1

修改完成后再点击左上角运行

如果运行不能正常运行有卡住的情况,可以在设置中将断点去掉如下图

再次运行,输入账号密码即可成功运行。

但此题与U盘恢复出来的图片内容当中的恢复密钥值是一致的

通过网盘分享的文件:2024杯资格赛程序逆向

链接:s://pan.aidu/s/1TyTYO-yYldNpiVwV0qatQ?pwd=vdf2提取码:vdf2

--来自百度网盘超级会员v7的分享

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/6813.html

分享给朋友:

相关文章

PS有哪些实用小技巧,小白也能一学就会?

PS有哪些实用小技巧,小白也能一学就会?

不看后悔系列!本篇分享25个PS实用的技巧!不能保证每个都能让你惊艳,但是却是我用心写出来的,希望对你有帮助。另外我的知乎也写了接近200篇PS的技巧,超级合集分享!我目前正在带一个PS/Ai的软件训练营,两个多月搞定两大软件的学习详细的内...

电视上哪个软件可以免费看电视直播?

电视上哪个软件可以免费看电视直播?

今天给大家推荐8款免费电视端直播看剧软件,感兴趣的朋友可以下载试一试!1、超级ITV 6.04免费看电视直播,央视卫视高清秒播,还有电影电视剧少儿体育等。2、小鲸电视 1.3.1小鲸电视是一款智能电视应用,集成了多个内容来源,包括腾讯视频、...

你手机里有哪些堪称神器的 App?

你手机里有哪些堪称神器的 App?

嗨嗨,我是赢酱~首先我认为对于我们有用的提升自我的都是手机里的神器 App。 一个人应该什么样子呢?在我从女孩子的角度看来,自律,上进,会打扮,情商高,会挣钱,独立,落落大方,这才是应该有的样子,我们可以借助手机不断学习改变今天给大家准备的...

我觉得华为Mate60Pro明明配置不高,为什么还是有那么多人买呢?

我也好奇啊,所以闲聊时,我问了我们公司的副总,我说Mate60pro配置这么拉胯你怎么还买啊?他一脸疑惑的看着我,配置?什么配置?我这手机信号挺好的啊?我们总经理用的是去年华为出的折叠手机,花了一万多,我也想问问他同样的问题,但奈何一直没有...

小米15就要来了,不知道小米15值不值得买?

小米15就要来了,不知道小米15值不值得买?

俗话说得好,好饭不怕晚,看似有点姗姗来迟的小米15系列,一官宣就迅速登上热搜。在此次小米14发布会上,雷军曾说过小米14将是最后一代3999起的旗舰,那么这一次涨价了的小米15,值不值得买呢?下面为大家总结一下小米15将会有哪些升级点:软件...

有哪些是你用上了mac才知道的事?

用上了高端的Mac(已退货)才知道:原来文件夹里面的文件,你看到是8个,其实可能有12个。其中3个图标重叠在一起了,另外一个被拖动到屏幕外面了。用上了高端的Mac(已退货)才知道:原来鼠标灵敏度有问题是因为系统内置了鼠标加速度,只能用控制台...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。