最新消息:

登录暴力破解 | 逆向笔记(一)

逆向工程 demon 1161浏览 0评论

这段时间ONDragon在群中了做了个有关逆向的公开课讲座,觉得蛮受用的。所以决定和大家分享下我的学习思路,同时也算是给自己做个笔记。

1.源代码

#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;
}

2.编译运行

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

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

3.载入IDA

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

这里我们需要将他跳到

这里很明显可以看到,从程序入口点到键入用户名和密码,是如何循环的

  1. JNZ : jump if not zero 结果不为零则转移,单标志条件转移,当ZF=0时转移。
  2. 我们这里需要将它跳转到不为0,也就是z标志位为1

4.载入Olldebug

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

我们在反汇编窗口右键使用字符串搜索功能,搜索关键处。

在搜索处,我们可以看到熟悉的字符串

这里我们可以找Login successful ,我们这里双击跟进跟踪,我们找到Login successful相关的汇编代码,在往上看我们可以看到,我们之前在IDA看到的 jnz 汇编跳转指令。

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

修改Z标志位

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

1.我们在 jnz 处下个断点。(断点快捷键F2)

2.我们将其程序运行,输出错误的用户名和密码,断点处,自动断下。

这里我们可以看到Z标注处为1

我们将其z标志位 双击 修改成1

我们运行程序,显示登录成功

程序停止

修改汇编指令

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

JE——若ZF=1,则跳转,jnz与je相反

修改完后,我们运行程序,同样登录成功

第一次写这类文章(大牛勿喷)学无止境,有兴趣的可以加入我们的技术群:307283889 观看OND老哥的逆向公开课 ,一起交流与探讨。如文章内容有误也欢迎大家为我指正,谢谢!!!

转载请注明:即刻安全 » 登录暴力破解 | 逆向笔记(一)

您必须 登录 才能发表评论!

合作伙伴