2019年1月16日【第三天学习】

2019年1月16日星期三

任务一、运行CrackMe1.exe,提示 "嗯,对了" 代表成功。首先修改exe使得出现成功提示,其次不修改exe输入正确的密码达到成功的目的。

hint:https://blog.csdn.net/Nagi_Way/article/details/68961121

使用.Net的Reflector反编译器,使用F3查找该函数

 

 

byte[] bytes = Encoding.ASCII.GetBytes("wctf{wol");

byte[] rgbIV = Encoding.ASCII.GetBytes("dy_crack}");

DESCryptoServiceProvider provider = new DESCryptoServiceProvider();

int keySize = provider.KeySize;

MemoryStream stream = new MemoryStream();

CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(bytes, rgbIV), CryptoStreamMode.Write);

StreamWriter writer = new StreamWriter(stream2);

writer.Write(data);

writer.Flush();

stream2.FlushFinalBlock();

writer.Flush();

return Convert.ToBase64String(stream.GetBuffer(), 0, (int) stream.Length);

 

密文:fOCPTVF0diO+B0IMXntkPoRJDUj5CCsT

密钥:wctf{wol

偏移量:dy_crack}

明文:wctf{dotnet_crackme1}

 

任务二、阅读下面文章,写出阅读心得

http://www.vuln.cn/7115

http://www.vuln.cn/7116

http://www.vuln.cn/7117

http://www.vuln.cn/7118

 

博客一:

1、JVM字节码比其他的X86低级代码更加容易反编译

1)多很多相关类型的信息

2)JVM(java虚拟机)内存模式更加严格和概括

3)Java编译器没有做任何优化工作(JAM JIT不是实时)

 

2、JVM知识何时有用?

1)分析混淆代码

2)创建自己的混淆器

3)创造编译器代码生成器

 

3、javap –c   反编译器      

1)通过编译确定内存申请状况

编译:

Int i=2;

Int j=3;

 

  Code:
   0:   iconst_2    //把2放到栈顶
   1:   istore_1    //把栈顶的值放到局部变量1中,即i中
   2:   iconst_3    //把3放到栈顶
   3:   istore_2    //把栈顶的值放到局部变量1中,即j中
   4:   return

 

编译:

Int i=2;

Int j=2;

 

  Code:
   0:   iconst_2    //把2放到栈顶
   1:   istore_1    //把栈顶的值放到局部变量1中,即i中
   2:   iconst_2    //把2放到栈顶
   3:   istore_2    //把栈顶的值放到局部变量2中,即j中(i 和 j同时指向2)
   4:   return

 

编译:

Int i=2;

Int j=i;

 

  Code:
   0:   iconst_2    //把2放到栈顶
   1:   istore_1    //把栈顶的值放到局部变量1中,即i中
   2:   iload_1     //把i的值放到栈顶,也就是说此时栈顶的值是2
   3:   istore_2    //把栈顶的值放到局部变量2中,即j中
   4:   return

 

2)通过编译确定i++与++i的区别与联系

Int i=1;   I++;

Int j=1;   J++

 

 Code:
  0:   iconst_1
  1:   istore_1
  2:   iinc    1, 1 //这个个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变  化,i此时变成2了
  5:   iconst_1
  6:   istore_2
  7:   iinc    2, 1//这个个指令,把局部变量2,也就是j,增加1,这个指令不会导致栈的变化,j此时变成2了
  10:  return

 

Int i=1;   I++;

Int j=1;   ++J;

 

  Code:
   0:   iconst_1
   1:   istore_1
   2:   iload_1
   3:   iinc    1, 1  //局部变量1(即i)加1变为2,注意这时栈中仍然是1,没有改变
   6:   istore_1    //把栈顶的值放到局部变量1中,即i这时候由2变成了1
   7:   iconst_1
   8:   istore_2
   9:   iinc    2, 1 //局部变量2(即j)加1变为2,注意这时栈中仍然是1,没有改变
   12:  iload_2    //把局部变量2(即j)的值放到栈顶,此时栈顶的值变为2
   13:  istore_2   //把栈顶的值放到局部变量2中,即j这时候真正由1变成了2
   14:  return

 

理解了上面的程序,我们来看一个很有趣的程序:

public class a{

       public static void main(String[] args){

       int m=0;

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

              m=m++;

       System.out.println(m);

}

}

先看结果:

 

是不是很惊艳!至少我被惊艳了!

当执行m=m++的时候m的值加一了,但是栈中的值还是0

 

Python中是没有i++的

Java的i++输出为0

C的i++输出是100

 

证明参考博客:

http://www.cnblogs.com/beautiful-code/p/6424977.html

https://www.cnblogs.com/tutuu/p/4115172.html

https://blog.csdn.net/qq_37937537/article/details/79931157

证明如下:

 

【这里有图片无法上传,便不再上传,感兴趣同学自行研究】

程序如下:

 

 

 

m++的:

Code:

       0: iconst_0                            //把0放到栈顶

       1: istore_1                             //把栈顶元素放到1号存储块中,即为m=0

       2: iconst_0                            //把0放到栈顶

       3: istore_2                             //把栈顶元素放到1号存储块中,即为i=0

       4: iload_2                              //把局部变量2(m)放到栈顶

       5: bipush        100           //循环100次

       7: if_icmpge     19

      10: iinc          1, 1            //把局部变量1加一,m++

      13: iinc          2, 1            //把局部变量2加一,i++

      16: goto          4              //前往4号地址块

      19: getstatic                         // Field java/lang/System.out:Ljava/io/PrintStream;

      22: iload_1

      23: invokevirtual #3             // Method java/io/PrintStream.println:(I)V

 

m=m++的:

    Code:

       0: iconst_0                            //把0放到栈顶

       1: istore_1                             //把栈顶元素放到局部变量表第1个位置中,即为m=0

       2: iconst_0                            //把0放到栈顶

       3: istore_2                             //把栈顶元素放到局部变量表第2个位置号中,即为i=0

       4: iload_2                              //复制变量2入栈

       5: bipush        100           //循环100次

       7: if_icmpge     21

      10: iload_1                              //m++

      11: iinc          1, 1

      14: istore_1                      重点//将命令10的结果赋给变量1,组合命令,勿单看

      15: iinc          2, 1            //i++

      18: goto          4              //跳转到4

      21: getstatic                         // Field java/lang/System.out:Ljava/io/PrintStream;

      24: iload_1

      25: invokevirtual #3           // Method java/io/PrintStream.println:(I)V

      28: return

 

转载于:https://www.cnblogs.com/wuruixin/p/10281605.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转oracle 11g(46):图解oracle数据库

1构成 由实例和数据库构成 2构成 3市例 4构成

linux一系统是一种,LINUX操作系统是一种( )

LINUX操作系统是一种( )答&#xff1a;多用户多进程系统在选择创业项目之前&#xff0c;应该()。答&#xff1a;以上都是下列选项中不属于面向对象编程语言的是答&#xff1a;C语言解决渠道成员评价、激励不当这一问题的应对策略是( )答&#xff1a;确立合理的评价和激励标准&a…

[Leedcode][JAVA][第46题][全排列][回溯算法]

【问题描述】 46.全排列 &#xff08;中等&#xff09; 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。示例:输入: [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] ]【解答思路】 1. 回溯 时间复杂度&#xff1a;O(NN&#xff01;) 空间…

JCE安装使用报错

"description":"No key was installed for encryption service","status":"NO_KEY" 错误描述{"description": "No key was installed for encryption service","status": "NO_KEY" } 错误原因…

java学习(167):生产者消费者问题

class Ck {private char[] r1 new char[8];private int wp 0;public synchronized void shengchan(char aa) {while (wp r1.length) //满了try {this.wait();} catch (Exception e) {}this.notify();//叫醒另一个线程&#xff0c;当前线程处于就绪状态r1[wp] aa;wp;System.…

个人linux版本管理,浅谈各个Linux版本的个人看法

AndroidAndroid手机是一个基于Linux内核的操作系统&#xff0c;这个版本相信大家没有异议&#xff0c;因为与iphone手机可以相提并论以外&#xff0c;就是最好用的操作系统&#xff0c;当然这应该是局限以移动端设备&#xff0c;因为它就是为此而诞生的。优点&#xff1a;可以与…

[Markdown语法][快速入门][CSDN]

Markdown语法Markdown学习资料【使用建议】快捷键目录标题文本样式列表链接代码片表格注释 & 注脚自定义列表LateX数字公式插入甘耐图插入UML图插入Mermaid流程图插入Flowchart流程图Markdown学习资料 「中文文案排版指北」 「官方文档」 [科学上网] 【使用建议】 Mark…

常用开发环境搭建配置教程(OneStall)

最近想要做一个小东西&#xff0c;用到了下面几个中间件或者环境&#xff1a; Java Tomcat Maven MongoDB ZooKeeper Node 并且恰好碰到腾讯云打折&#xff0c;云主机原价100多一个月&#xff0c;花了30块钱买了三个月。买下后立即动手准备开始环境配置。 说到环境&#xff0c;…

sqlserver:(1):sqlserver安装超详细

1第一步&#xff0c;下载对应的镜像文件链接&#xff1a; https://pan.baidu.com/s/1nBwjrukxCAMD4xLdYofPXA 提取码&#xff1a;9rv7 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 然后&#xff0c;点击左面安装&#xff0c;在显示页面中点击全新SQLServer独…

linux 5识别网卡,CentOS 5.5系统识别不了Atheros AR8151网卡怎么办?

在安装完CentOS 5.5系统后&#xff0c;有些人出现无法上网的现象&#xff0c;经检测发现是Atheros AR8151网卡识别不了&#xff0c;遇到这种问题不用怕&#xff0c;下面小编就给大家介绍下CentOS 5.5无法识别Atheros AR8151网卡的解决方法。现象前段时间&#xff0c;在一台电脑…

混合代码块 Markdown Leedcde

混合代码块 Markdown&#xff08;仅限Leedcode&#xff09; 使用说明 Markdown 语法 注意语言后有空格 &#xff01; 展示效果

java学习(168):java连接SQL server数据库

1安装sql server数据库 2打开eclipse写入以下代码 package sjk;import java.sql.*;public class Main {//这里可以设置数据库名称private final static String URL "jdbc:sqlserver://localhost:1433;DatabaseNametest";private static final String USER"sa&…

python shelve模块

shelve很简单,操作跟字典操作一样: 1 import shelve 2 f shelve.open(sss) # 有文件会读取,没有会创建..shelve是三个文件,后缀名为.bak.dat.dir(哪个都不要人为去修改) 3 f[name] [1,2,3,{1:2}] # 直接添加键值对,跟字典操作一样,,非常简单 4 print(f[name]) …

linux系统中使用pycharn,在pycharm中使用linux控制台

我是pycharm&#xff0c;virtualenv&#xff0c;linux和git的新手。在pycharm中使用linux控制台我最近开始使用djangoto make webapps的旅程。在我使用崇高来制作脚本之前&#xff0c;现在需要一个更复杂的项目管理系统&#xff0c;例如pycarm。我真的想要一个linux虚拟机并走上…

mongo:(1)nosql简介

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 NoSQL 简介 NoSQL(NoSQ…

[Leedcode][JAVA][第33题][搜索旋转排序数组]

【问题描述】[33. 搜索旋转排序数组] [中等] 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如&#xff0c;数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值&#xff0c;如果数组中存在这个目标值&#xff0c;则返回它的索引&#xff0…

001. Ansible简介

一 简介 Ansible是一款极其简单的自动化运维工具, 基于Python开发, 集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点。 实现了批量系统配置, 批量程序部署, 批量运行命令等功能。 Ansible是基于模块工作的, 本身没有批量部署的能力。真正具有批量部署的是ansi…

mongo:(2)mongoDB简介

什么是MongoDB ? MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…

linux分割图片软件,桌面应用|5 种拆分 Linux 终端的方法

本文介绍了 Linux 提供的拆分终端的方法&#xff0c;它能够帮助你完成多任务工作。那么&#xff0c;你最喜欢哪一款终端复用工具呢&#xff1f;没有什么问题是不能用一个 Linux 终端解决的&#xff0c;如果不行&#xff0c;那就用两个。很早以前&#xff0c;终端其实是一个物理…

zabbix触发器表达式

zabbix触发器表达式 触发器使用逻辑表达式来评估通过item获取的数据是处于哪种状态&#xff0c; 触发器中的表达式使用很灵活&#xff0c;我们可以创建一个复杂的逻辑测试监控&#xff0c;触发器表达式形式如下: {<server>:<key>.<function>(<parameter&g…