逆向学习2

2018.7.26

大端序与小端序
简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了。注意字节序是硬件层面的东西,对于软件来说通常是透明的。再说白一点,字节序通常只和你使用的处理器架构有关,而和编程语言无关,比如常见的Intel x86系列就是小端序。
Big-endian(大端序):
数据的高位字节存放在地址的低端 低位字节存放在地址高端
Little-endian(小端序):
数据的高位字节存放在地址的高端 低位字节存放在地址低端
字节的高位与低位
举个例子,int a = 0x12345678 ; 那么左边12就是高位字节,右边的78就是低位字节,从左到右,由高到低,(注意,高低乃相对而言,比如56相对于78是高字节,相对于34是低字节)
地址的高端与低端
0x00000001
0x00000002
0x00000003
0x00000004
从上倒下,由低到高,地址值小的为低端,地址值大的为高端。
看看两种方式如何存储数据,假设从地址0x00000001处开始存储十六进制数0x12345678,那么
Bit-endian 如此存放(按原来顺序存储)
0x00000001 – 12
0x00000002 – 34
0x00000003 – 56
0x00000004 – 78
Little-endian 如此存放(颠倒顺序储存)
0x00000001 – 78
0x00000002 – 56
0x00000003 – 34
0x00000004 – 12
一个很好的记忆方法是,大端序是按照数字的书写顺序进行存储的,而小端序是颠倒书写顺序进行存储的。
这里写图片描述
今天发了一个小程序,打开后是上图,把它拖进IDA64位后,发现解析文件名有很多不知道打开哪个,可以试着打开主函数(main)文件,出现代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
  _main();
  present();
  heart();
  system("pause");
  return 0;
}

一个个打开函数看后,发现present()函数有用,打开后

 y = 2027091370;
  std::istream::operator>>(&std::cin, &n);
  while ( n != y )
  {
    if ( n == 5201314 )
    {
      std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F068);
      system("pause");
      exit(0);
    }
    if ( !(y % 40) )
      y = 2027091370;
    v0 = std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F0A0);
    v1 = (std::ostream *)std::ostream::operator<<(v0, x);
    std::operator<<<std::char_traits<char>>(v1, &byte_47F0C3);
    std::istream::operator>>(&std::cin, &n);
    ++x;
    y += 7;
  }
  std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F0D8);

由代码可知,cin是输入,cout是输出,首先输入n,所以n代表的就是提取码
我们先如果while循环成立,我们可以先输入提取码为5201314 ,试试看n是否等于5201314 ,输入后发现仍是错误,所以n != 5201314 。接下来分析if条件,这时if条件不成立,我们可以任输入一个提取码,发现提示
这里写图片描述
所以v0输出的应该是这段文字,这时并没有提取成功,y+=7循环运行后,如果if条件成立,也会输出v0,所以要想提取成功,就要跳出这个循环,令n等于y
所以可以一开始就输入提取码为 2027091370,也可以再次输入时循环加7,例如
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值