enter description here

前阵子ONDragon之前在群中了做了一个公开课,我觉得蛮受用的。决定和各位分享下,自己的过程,同时也是给我自己做个笔记。

1.源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
string userName("ONDragon"), passWord("666"); \\设定用户名密码
#define Log(str) {{printf("[Log] => %s\n",str);}}
BOOL check(string name, string pass)
{
if ( name.empty() || pass.empty() )
{
return FALSE;
}
if (name == userName && pass ==passWord) \\判断用户名和密码是否正确,逻辑判断
{
return TRUE;
}
else
{
return FALSE;
}
}
int main()
{
Log("Begain Main");
char name[100]; \\定义用户名和密码是char类型
char pass[100];
while (TRUE)
{
cout << "Please input your userName :" << endl; \\输入用户名和密码
cin >> name;
cout << "Please input your passWord :" << endl;
cin >> pass;
if (check(string(name), string(pass))) \\关键函数check
{
Log("Login Successful"); \\登录成功
Sleep(5000);
return 1;
}
else
{
Log("Login Failed"); \\否则失败就会循环重复输入用户名密码
}
}
Log("End Main");
return 0;
}

&nbsp;

2.编译运行

1
2
3
4
5
6
7
8
9
10
root@demon:~# ls
FirstClass.cpp
root@demon:~# i586-mingw32msvc-g++ -o secist.exe FirstClass.cpp
FirstClass.cpp:61:2: warning: no newline at end of file
root@demon:~# wine secist
[Log] => Begain Main
Please input your userName :
1123
Please input your passWord :
123

enter description here

因为本机是OSX 懒得用windows下编译,我这里直接用mingw32 编译,用wine运行,结果是输错账户密码,循环让用户输入,直到正确的用户名和密码。
&nbsp;

3.载入IDA

将secist.exe 拖入IDA查看下流程图,看下程序是如何运行

enter description here

这里我们需要将他跳到

这里很明显可以看到,从程序入口点到键入用户名和密码,是如何循环的
1.JNZ : jump if not zero 结果不为零则转移,单标志条件转移,当ZF=0时转移。
2.我们这里需要将它跳转到不为0,也就是z标志位为1
&nbsp;

enter description here

4.载入Ollydebug

接下来我们将程序载入OD 看看。前面我们已经知道程序的整个流程了,我们需要找到jmp的关键处

enter description here
&nbsp;
我们在反汇编窗口,右键,使用字符串搜索功能,搜索关键处。

enter description here
&nbsp;
在搜索处,我们可以看到熟悉的字符串
&nbsp;
enter description here
&nbsp;
这里我们可以找Login successful ,我们这里双击跟进跟踪,我们找到Login successful相关的汇编代码,在往上看我们可以看到,我们之前在IDA看到的 jnz 汇编跳转指令。

enter description here

我们这里可以使用几种方法。
判断后如果不跳,就会到下一个jmp,jmp是无条件跳,既然错误的话,jnz会跳到错误信息,那么我们输入错误后,jz就肯定不跳. (Akkuman师傅教了我也很多)

修改Z标志位。

我们来看看 jnz ,也就说jmp not zero(跳转不是0的地方) 现在z标志位为1,需要将其修改为 0.即可实现输入错误信息,就跳转到成功登陆。

1.我们在 jnz 处下个断点。(断点快捷点F2)
&nbsp;
enter description here
&nbsp;
2.我们将其程序运行,输出错误的用户名和密码,断点处,自动断下。
&nbsp;
enter description here
&nbsp;
这里我们可以看到Z标注处为1
enter description here
&nbsp;
我们将其z标志位 双击 修改成1
&nbsp;
enter description here
&nbsp;
enter description here
&nbsp;
我们将其程序运行,显示登录成功
&nbsp;
enter description here

程序停止

enter description here

修改汇编指令

我们重新载入OD ,依旧找到 jnz 位置,双击jnz 处汇编代码,将jnz其修改为je
enter description here

JE——若ZF=1,则跳转,jnz 与je 相反
&nbsp;
enter description here
&nbsp;
修改完后,我们将其运行程序,同样得到成功登录
&nbsp;
enter description here
&nbsp;
学无止境,有兴趣看OND 老哥的逆向课,可以加入技术群 群号:307283889 ,一起交流技术性探讨。如有文章相关不对的地方,可指出,谢谢!!!