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

题目

在这里插入图片描述

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

在这里插入图片描述
好丑…点击就退出
可以美化。。。看雪给的题解美化了,而且输错密码有提示
我看了一下,应该能实现出来吧…但我太懒了。。也太菜了
在这里插入图片描述
在这里插入图片描述

发布了47 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zmx2473162621/article/details/105715332