看雪加密与解密第四版随书chap03练习题解ReverseMes by SantMat #1

181 阅读13分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

在这里插入图片描述

FIRST

运行一下程序,看一下,这个程序主要的功能,以及我们需要做什么: 在这里插入图片描述

我们可以注意到

标题:save the world 内容:分段的 you have .... 一个按钮

内容翻译: 您刚刚可以访问包含其中一个程序的服务器,该程序能够在全世界范围内引发核设备的连锁反应。现在,该程序计划在1个月内发送给Evil博士! 现在,您的第一个响应将是删除存在的文件,但是您只有服务器上的修改访问权限,无法删除程序。 如果您选择接受,这是您的任务: 您必须通过使现在看到的该屏幕进入密码保护屏幕来使程序反向,从而只有正确的密码才能使用该致命程序。 您可以做任何您想做的事情,只要确保它受密码保护即可。不用担心,Evil博士太愚蠢而无法破解您提供的保护。 因此,快来拯救世界。您是唯一的希望。你有一个月!不要让我们失望!

然后我们点击继续按钮:

在这里插入图片描述 发现两个按钮,一个点击之后会boooom!爆炸, 另一个是退出这个程序的按钮

所以我们的目的是

阻止evil进入这个程序,通过修改第一个界面,加上一个输入密码验证

Second

tools: ida pro od 拉入ida中 在这里插入图片描述 第一个页面是这样的,首先,我们要思考,这是个什么程序,这好像不是用说用codeblock什么的c++写出来的,那么,我们看一下函数窗口,发现都是createwindowexa这些函数,调用的是底层函数api,那么就要去想,我们要做的,和要用的都有哪些 首先,想要定位到第一个窗口对于的信息,所以,我们在后边函数窗口找到(第二种方法,直接打开视图-打开子视图-字符串窗口,找都save the world,进去,然后找这个地方的调用) CreateWindowExA函数 在这里插入图片描述 双击进去, .text:0040155E CreateWindowExA proc near 在这个地方按x弹出交叉参考 在这里插入图片描述 找到了都有哪些地方调用了这个函数,进去第一个 在这里插入图片描述 发现了save the world这个关键地方,这不就是我们进去的第一个标题嘛 所以确定了这部分代码就是第一个窗口要创建的地方 当然有很多备注我们看不懂,没关系,可以看一下win32api的帮助手册 在这里插入图片描述 就会发现,备注一般就是这个函数参数

然后我们确定了这一步就是创建,那么我们就往下继续翻 在这里插入图片描述

突然发现这个地方,备注很熟悉,这不就是界面上显示的地方嘛 那么我们怎么输入密码呢? 可以编辑box,就可以,但是发现这些创建的窗口exa都可以edit,看备注,都可以edit 那么我们用哪一个作为我们的输入密码的地方呢? 思考一下,咦,输入之后要get,所以我们用函数窗口的get,然后通过调用定位,或者直接f5反汇编 在这里插入图片描述 找到get,光标方上,然后找到汇编代码哪里 .text:004013D2 shr eax, 10h .text:004013D5 or ax, ax .text:004013D8 jnz short loc_401417 .text:004013DA push 200h ; nMaxCount .text:004013DF push offset String ; lpString .text:004013E4 push hWnd ; hWnd .text:004013EA call GetWindowTextA .text:004013EF push offset String2 ; "Here is your mission, if you choose to "... .text:004013F4 push offset String ; lpString1 .text:004013F9 call lstrcmpA .text:004013FE push [ebp+hWndParent] ; hWnd .text:00401401 call DestroyWindow .text:00401406 push 0Ah ; nCmdShow .text:00401408 push 0 ; int .text:0040140A push 0 ; int .text:0040140C push hInstance ; hInstance .text:00401412 call sub_40146A

然后这里有lstrcmpA,那就证明确实是这个地方,我们找对了,所以我们的目的就是把 "Here is your mission, if you choose to "...这一块变成可输入模式,然后给一个密码,验证,后面的验证部分我们不用操心,因为已经有了strcmp了,我们还要搞输入,然后付一个密码,就好! 回到刚才的creat部分,esc退步操作 在这里插入图片描述 这个地方,Here is your mission, if you choose to 我们要搞成输入模式,查一下createwindowexa(注意大小写,我这里随意了)的参数 把dwstyle由50000804h改为:50800000h 改的时候可以用od吧,我用ida的时候用不得不熟... od改的时候按照地址就好了 ok 然后 输入的offset string2就没用了,我们把它变成push 0 其他的提示地方同理push 0 然后开始考虑,验证密码 在这里插入图片描述 这个地方的返回值,要加一个判断,不通过我们就直接退出程序,通过才可以 在这里插入图片描述 这是lstrcmp的返回值,我们知道,等于0就是相等,所以,等于0才能进入下一步 在这里插入图片描述 这一段的代码要等判断正确才可以执行 所以我们要想办法cmp之后跳到一个比较函数的地方 那我们就可以利用之前一些多余的部分,比如空白的编辑栏 在这里插入图片描述 我们把这个地方改了,所以在输入字符串后就直接跳到按钮部分的代码,就可以完美避开这一部分,然后这一部分就可以做我们私有地方,想干嘛干嘛

.text:004011CA                 mov     hWnd, eax
.text:004011CF                 push    0               ; lpParam
.text:004011D1                 push    hInstance       ; hInstance
.text:004011D7                 push    7               ; hMenu

.text:004011CA mov hWnd, eax 改为:jmp 40126c 然后对于

.text:004013EF                 push    offset String2  ; "Here is your mission, if you choose to "...
.text:004013F4                 push    offset String   ; lpString1
.text:004013F9                 call    lstrcmpA
.text:004013FE                 push    [ebp+hWndParent] ; hWnd
.text:00401401                 call    DestroyWindow
.text:00401406                 push    0Ah             ; nCmdShow
.text:00401408                 push    0               ; int
.text:0040140A                 push    0               ; int
.text:0040140C                 push    hInstance       ; hInstance
.text:00401412                 call    sub_40146A

.text:004013FE push [ebp+hWndParent] ; hWnd 改为 jmp 4011cf 然后把 4011cf之后改成这样(可以不改,直接退出程序,这就比较流氓了,哈哈哈哈哈哈啊哈哈哈)

004011CF      83F8 00       CMP EAX,0
004011D2      75 19         JNZ SHORT reversem.004011ED
004011D4      FF75 08       PUSH DWORD PTR SS:[EBP+8]
004011D7      E8 8E030000   CALL <JMP.&USER32.DestroyWindow>
004011DC      6A 0A         PUSH 0A
004011DE      6A 00         PUSH 0
004011E0      6A 00         PUSH 0
004011E2      68 F4334000   PUSH reversem.004033F4
004011E7      E8 7E020000   CALL reversem.0040146A
004011EC      90            NOP
004011ED      6A 00         PUSH 0
004011EF      E8 58030000   CALL <JMP.&KERNEL32.ExitProcess>

就是输对正常,输错直接退出 然后就可以了 因为我们对于 在这里插入图片描述

这个地方,string密码是空的,所以,这两个比较一定是不对的,所以他就无法进入啦 save the world ! 在这里插入图片描述 好丑.....点击就退出 可以美化。。。看雪给的题解美化了,而且输错密码有提示 我看了一下,应该能实现出来吧...但我太懒了。。也太菜了 在这里插入图片描述 在这里插入图片描述

题目

在这里插入图片描述

FIRST

运行一下程序,看一下,这个程序主要的功能,以及我们需要做什么: 在这里插入图片描述

我们可以注意到

标题:save the world 内容:分段的 you have .... 一个按钮

内容翻译: 您刚刚可以访问包含其中一个程序的服务器,该程序能够在全世界范围内引发核设备的连锁反应。现在,该程序计划在1个月内发送给Evil博士! 现在,您的第一个响应将是删除存在的文件,但是您只有服务器上的修改访问权限,无法删除程序。 如果您选择接受,这是您的任务: 您必须通过使现在看到的该屏幕进入密码保护屏幕来使程序反向,从而只有正确的密码才能使用该致命程序。 您可以做任何您想做的事情,只要确保它受密码保护即可。不用担心,Evil博士太愚蠢而无法破解您提供的保护。 因此,快来拯救世界。您是唯一的希望。你有一个月!不要让我们失望!

然后我们点击继续按钮:

在这里插入图片描述 发现两个按钮,一个点击之后会boooom!爆炸, 另一个是退出这个程序的按钮

所以我们的目的是

阻止evil进入这个程序,通过修改第一个界面,加上一个输入密码验证

Second

tools: ida pro od 拉入ida中 在这里插入图片描述 第一个页面是这样的,首先,我们要思考,这是个什么程序,这好像不是用说用codeblock什么的c++写出来的,那么,我们看一下函数窗口,发现都是createwindowexa这些函数,调用的是底层函数api,那么就要去想,我们要做的,和要用的都有哪些 首先,想要定位到第一个窗口对于的信息,所以,我们在后边函数窗口找到(第二种方法,直接打开视图-打开子视图-字符串窗口,找都save the world,进去,然后找这个地方的调用) CreateWindowExA函数 在这里插入图片描述 双击进去, .text:0040155E CreateWindowExA proc near 在这个地方按x弹出交叉参考 在这里插入图片描述 找到了都有哪些地方调用了这个函数,进去第一个 在这里插入图片描述 发现了save the world这个关键地方,这不就是我们进去的第一个标题嘛 所以确定了这部分代码就是第一个窗口要创建的地方 当然有很多备注我们看不懂,没关系,可以看一下win32api的帮助手册 在这里插入图片描述 就会发现,备注一般就是这个函数参数

然后我们确定了这一步就是创建,那么我们就往下继续翻 在这里插入图片描述

突然发现这个地方,备注很熟悉,这不就是界面上显示的地方嘛 那么我们怎么输入密码呢? 可以编辑box,就可以,但是发现这些创建的窗口exa都可以edit,看备注,都可以edit 那么我们用哪一个作为我们的输入密码的地方呢? 思考一下,咦,输入之后要get,所以我们用函数窗口的get,然后通过调用定位,或者直接f5反汇编 在这里插入图片描述 找到get,光标方上,然后找到汇编代码哪里 .text:004013D2 shr eax, 10h .text:004013D5 or ax, ax .text:004013D8 jnz short loc_401417 .text:004013DA push 200h ; nMaxCount .text:004013DF push offset String ; lpString .text:004013E4 push hWnd ; hWnd .text:004013EA call GetWindowTextA .text:004013EF push offset String2 ; "Here is your mission, if you choose to "... .text:004013F4 push offset String ; lpString1 .text:004013F9 call lstrcmpA .text:004013FE push [ebp+hWndParent] ; hWnd .text:00401401 call DestroyWindow .text:00401406 push 0Ah ; nCmdShow .text:00401408 push 0 ; int .text:0040140A push 0 ; int .text:0040140C push hInstance ; hInstance .text:00401412 call sub_40146A

然后这里有lstrcmpA,那就证明确实是这个地方,我们找对了,所以我们的目的就是把 "Here is your mission, if you choose to "...这一块变成可输入模式,然后给一个密码,验证,后面的验证部分我们不用操心,因为已经有了strcmp了,我们还要搞输入,然后付一个密码,就好! 回到刚才的creat部分,esc退步操作 在这里插入图片描述 这个地方,Here is your mission, if you choose to 我们要搞成输入模式,查一下createwindowexa(注意大小写,我这里随意了)的参数 把dwstyle由50000804h改为:50800000h 改的时候可以用od吧,我用ida的时候用不得不熟... od改的时候按照地址就好了 ok 然后 输入的offset string2就没用了,我们把它变成push 0 其他的提示地方同理push 0 然后开始考虑,验证密码 在这里插入图片描述 这个地方的返回值,要加一个判断,不通过我们就直接退出程序,通过才可以 在这里插入图片描述 这是lstrcmp的返回值,我们知道,等于0就是相等,所以,等于0才能进入下一步 在这里插入图片描述 这一段的代码要等判断正确才可以执行 所以我们要想办法cmp之后跳到一个比较函数的地方 那我们就可以利用之前一些多余的部分,比如空白的编辑栏 在这里插入图片描述 我们把这个地方改了,所以在输入字符串后就直接跳到按钮部分的代码,就可以完美避开这一部分,然后这一部分就可以做我们私有地方,想干嘛干嘛

.text:004011CA                 mov     hWnd, eax
.text:004011CF                 push    0               ; lpParam
.text:004011D1                 push    hInstance       ; hInstance
.text:004011D7                 push    7               ; hMenu

.text:004011CA mov hWnd, eax 改为:jmp 40126c 然后对于

.text:004013EF                 push    offset String2  ; "Here is your mission, if you choose to "...
.text:004013F4                 push    offset String   ; lpString1
.text:004013F9                 call    lstrcmpA
.text:004013FE                 push    [ebp+hWndParent] ; hWnd
.text:00401401                 call    DestroyWindow
.text:00401406                 push    0Ah             ; nCmdShow
.text:00401408                 push    0               ; int
.text:0040140A                 push    0               ; int
.text:0040140C                 push    hInstance       ; hInstance
.text:00401412                 call    sub_40146A

.text:004013FE push [ebp+hWndParent] ; hWnd 改为 jmp 4011cf 然后把 4011cf之后改成这样(可以不改,直接退出程序,这就比较流氓了,哈哈哈哈哈哈啊哈哈哈)

004011CF      83F8 00       CMP EAX,0
004011D2      75 19         JNZ SHORT reversem.004011ED
004011D4      FF75 08       PUSH DWORD PTR SS:[EBP+8]
004011D7      E8 8E030000   CALL <JMP.&USER32.DestroyWindow>
004011DC      6A 0A         PUSH 0A
004011DE      6A 00         PUSH 0
004011E0      6A 00         PUSH 0
004011E2      68 F4334000   PUSH reversem.004033F4
004011E7      E8 7E020000   CALL reversem.0040146A
004011EC      90            NOP
004011ED      6A 00         PUSH 0
004011EF      E8 58030000   CALL <JMP.&KERNEL32.ExitProcess>

就是输对正常,输错直接退出 然后就可以了 因为我们对于 在这里插入图片描述

这个地方,string密码是空的,所以,这两个比较一定是不对的,所以他就无法进入啦 save the world ! 在这里插入图片描述 好丑.....点击就退出 可以美化。。。看雪给的题解美化了,而且输错密码有提示 我看了一下,应该能实现出来吧...但我太懒了。。也太菜了 在这里插入图片描述 在这里插入图片描述