第一篇文章,一次简单的逆向

本文讲述了在使用IDAPro进行逆向工程时遇到的问题,包括字符串大小判断不精确、char数组误转int指针,以及ifelse条件处理的不足。通过实例分析了一个简单的加密和解密程序,强调了在实际逆向中可能遇到的变量管理和逻辑转换。
摘要由CSDN通过智能技术生成

一个简单的逆向,

收获:

1、IDA Pro逆向时对字符串大小把握不够精准;

2、char数组逆向时会逆向成int数组的指针;

3、if else语句判断条件不那么精准。

4、逆向时会多出一些变量,如int等,没有实际意义。

感谢eastmount大神!!!更详细的实现可参考大神的文章。 参考文章:安全验证 - 知乎知乎,中文互联网高质量的问答社区和创作者聚集的原创内容平台,于 2011 年 1 月正式上线,以「让人们更好的分享知识、经验和见解,找到自己的解答」为品牌使命。知乎凭借认真、专业、友善的社区氛围、独特的产品机制以及结构化和易获得的优质内容,聚集了中文互联网科技、商业、影视、时尚、文化等领域最具创造力的人群,已成为综合性、全品类、在诸多领域具有关键影响力的知识分享社区和创作者聚集的原创内容平台,建立起了以社区驱动的内容变现商业模式。icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/461862715

原程序:

int main()

{

int i;

int len;

char key[20] = "";

char res[20] = "";

char num[20] = "eastmount";     //密钥

char right[20] = "123456789";   //正确值

//请输入正确的密码

printf("please input the key:");

scanf_s("%s", &key,20);

//判断

len = strlen(key);

if (len < 6 || len>10) {

printf("Error, The length of the key is 6~10\n");

}

else {

//加密

for (i = 0; i < len; i++) {

res[i] = (key[i] ^ num[i]); //异或加密

}

//printf("%s\n", res);

if (strcmp(res, right) == 0) {

printf("You are right, Success.\n");

}

else {

printf("Error, please input the right key.\n");

}

}

return 0;

}

IDA pro逆向程序:

int __cdecl main(int argc, const char **argv, const char **envp)

{

  char Str2[4]; // [esp+D0h] [ebp-88h]   // 字符串大小有差异

  int v5; // [esp+DAh] [ebp-7Eh]

  int v6; // [esp+DEh] [ebp-7Ah]

  __int16 v7; // [esp+E2h] [ebp-76h]

  int v8; // [esp+ECh] [ebp-6Ch] // 原程序为char字符串

  int v9; // [esp+F6h] [ebp-62h]

  int v10; // [esp+FAh] [ebp-5Eh]

  __int16 v11; // [esp+FEh] [ebp-5Ah]

  char Str1[28]; // [esp+108h] [ebp-50h]  //字符串大小有差异

  char Str[28]; // [esp+124h] [ebp-34h]

  int v14; // [esp+140h] [ebp-18h]

  int i; // [esp+14Ch] [ebp-Ch]

  j___CheckForDebuggerJustMyCode(&unk_41C00E);

  strcpy((char *)&v8, "eastmount");

  v9 = 0;

  v10 = 0;

  v11 = 0;

  strcpy(Str2, "123456789");

  v5 = 0;

  v6 = 0;

  v7 = 0;

  j_printf("please input the key:");

  j_scanf_s("%s", Str, 20);

  v14 = j__strlen(Str);

  if ( v14 >= 6 && v14 <= 10 )  // 与原来程序相反

  {

    for ( i = 0; i < v14; ++i )

      Str1[i] = *((_BYTE *)&v8 + i) ^ Str[i];

    if ( !j__strcmp(Str1, Str2) )

      j_printf("You are right, Success.\n");

    else

      j_printf("Error, please input the right key.\n");

  }

  else

  {

    j_printf("Error, The length of the key is 6~10\n");

  }

  return 0;

}

解密程序

int main()

{

    char str2[10] = "123456789";

    char str1[10] = "eastmount";

    char key[10];

    for (int i = 0;i < 10;i++)

    {

        key[i] = str1[i] ^ str2[i];

    }

printf("The key is %s", key);

return 0;

}

  • 32
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值