有一个exe程序,如何快速逆向到源码并自己写一个?
作者:卡卷网发布时间:2025-01-07 17:01浏览数量:108次评论数量:0次
此次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
处)继续执行后续代码;如果ZF
为1
(即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
,并传入v24
、v23
、v22
这几个参数,具体该函数的功能取决于其内部实现,从上下文推测可能是为了后续获取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杯资格赛程序逆向
链接:
--来自百度网盘超级会员v7的分享
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:从底层内核开始完全自主开发一个作的难度到底有多大?
- 下一篇:网易是如何掉队的?
相关推荐

你 发表评论:
欢迎