[20191127]表 full Hash Value的计算.txt

--//曾经做过表full Hash Value的计算,当时我是通过建立简单的schema以及表名的形式,使用hashcat破解oracle的
--//表 full Hash Value的计算,参考链接:

http://blog.itpub.net/267265/viewspace-2149366/ => [20171227]表的FULL_HASH_VALUE值的计算
http://blog.itpub.net/267265/viewspace-2214232/ => [20180914]oracle 12c 表 full_hash_value如何计算.txt

--//得到的结论是:
--//表的FULL_HASH_VALUE计算就是table_name.owner加上"\01\0\0\0".
--//12c引入了PDB,表的full_hash_value是table_name.owner.con_name\01\0\0\0的md5sum值.

--//昨天看了一篇博客,链接https://mvelikikh.blogspot.com/2019/07/vdbpipes-unveiling-truth-of-oracle-hash.html
--//作者通过DebugTrace获得oracle内部函数,主要通过kggmd5Update,确定里面参与运算的字符.
--//我仅仅重复作者的测试验证这个过程:

1.环境:
SYS@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2. 定位相关内部函数:

$ gdb $(which oracle )
GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-45.el5)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle...(no debugging symbols found)...done.

(gdb) disassemble kglComputeHash
...
0x00000000098445d8 <kglComputeHash+96>: movl   $0xefcdab89,0x4(%r9)
0x00000000098445e0 <kglComputeHash+104>:        mov    -0x48(%rbp),%r10
0x00000000098445e4 <kglComputeHash+108>:        movl   $0x98badcfe,0x8(%r10)
0x00000000098445ec <kglComputeHash+116>:        mov    -0x48(%rbp),%r11
0x00000000098445f0 <kglComputeHash+120>:        movl   $0x10325476,0xc(%r11)
0x00000000098445f8 <kglComputeHash+128>:        mov    0x10(%r15),%rsi
0x00000000098445fc <kglComputeHash+132>:        mov    (%r15),%edx
0x00000000098445ff <kglComputeHash+135>:        callq  0x97f09a4 <kggmd5Update>
0x0000000009844604 <kglComputeHash+140>:        movzbl 0x8(%r15),%eax
0x0000000009844609 <kglComputeHash+145>:        test   %eax,%eax
0x000000000984460b <kglComputeHash+147>:        je     0x984463a <kglComputeHash+194>
0x000000000984460d <kglComputeHash+149>:        lea    -0x90(%rbp),%rdi
0x0000000009844614 <kglComputeHash+156>:        lea    0x6359d1(%rip),%rsi        # 0x9e79fec <_2__STRING.98.0>
0x000000000984461b <kglComputeHash+163>:        mov    $0x1,%edx
0x0000000009844620 <kglComputeHash+168>:        callq  0x97f09a4 <kggmd5Update>
...
--//你可以发现多处kggmd5Update的调用.

3.建立gdb脚本:
$ cat md5.gdb
set pagination off

break kggmd5Update
  commands
    printf "Length: %d\n",$rdx
    x/8xc $rsi
    c
  end

break kglComputeHash
  commands
    c
  end

break kggmd5Process
  commands
    c
  end

break kggmd5Finish
  commands
    c
  end

--//session 1:
SCOTT@book> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
        75        751 21617                    DEDICATED 21618       29        156 alter system kill session '75,751' immediate;

--//session 2:
$ gdb -p 21618 -x md5.gdb
...
Breakpoint 1 at 0x97f09a8
Breakpoint 2 at 0x984457c
Breakpoint 3 at 0x97f14be
Breakpoint 4 at 0x97f0830

--//session 1:
SCOTT@book> desc emp
Name     Null?    Type
-------- -------- ------------
EMPNO    NOT NULL NUMBER(4)
ENAME             VARCHAR2(10)
JOB               VARCHAR2(9)
MGR               NUMBER(4)
HIREDATE          DATE
SAL               NUMBER(7,2)
COMM              NUMBER(7,2)
DEPTNO            NUMBER(2)

--//session 2,按c继续:
Breakpoint 2, 0x000000000984457c in kglComputeHash ()

Breakpoint 1, 0x00000000097f09a8 in kggmd5Update ()
Length: 3
0x7faa77e1fca8: 69 'E'  77 'M'  80 'P'  0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'
--//length=3,EMP对应表

Breakpoint 1, 0x00000000097f09a8 in kggmd5Update ()
Length: 1
0x9e79fec <_2__STRING.98.0>:    46 '.'  0 '\000'        0 '\000'        0 '\000'        107 'k' 116 't' 99 'c'  110 'n'
--//length=1 ,小数点.

Breakpoint 1, 0x00000000097f09a8 in kggmd5Update ()
Length: 5
0x863db2f4:     83 'S'  67 'C'  79 'O'  84 'T'  84 'T'  0 '\000'        0 '\000'        0 '\000'
--//length=5 ,SCOTT就是owner.

Breakpoint 1, 0x00000000097f09a8 in kggmd5Update ()
Length: 4
0x7fffbb155800: 1 '\001'        0 '\000'        0 '\000'        0 '\000'        -1 ''  127 '\177'      0 '\000'        0 '\000'
--//length=4 ,字符'\001\000\000\000'

Breakpoint 4, 0x00000000097f0830 in kggmd5Finish ()

Breakpoint 1, 0x00000000097f09a8 in kggmd5Update ()
Length: 43
0xbefbe20 <kggmd5padding.0>:    -128 '\200'     0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'

Breakpoint 1, 0x00000000097f09a8 in kggmd5Update ()
Length: 8
0x7fffbb155750: 104 'h' 0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'

--//这些字符拼接起来就是EMP.SCOTT\001\000\000\000,也就是表md5按照此内容计算.

SYS@book> select dbms_crypto.hash(rawtohex('EMP.SCOTT'||chr(1)||chr(0)||chr(0)||chr(0)), 2) c40 from dual;
C40
----------------------------------------
1EA14E682B60AB3ED11D8E77D1E781E2

--//1EA14E682B60AB3ED11D8E77D1E781E 按照4位反转就是 684ea11e 3eab602b 778e1dd1 0081e7d1
--//验证看看:

SYS@book> select owner,name,namespace,type,hash_value,full_hash_value from V$DB_OBJECT_CACHE where owner='SCOTT' and name='EMP';
OWNER  NAME NAMESPACE       TYPE  HASH_VALUE FULL_HASH_VALUE
------ ---- --------------- ----- ---------- --------------------------------
SCOTT  EMP  TABLE/PROCEDURE TABLE 3800164305 684ea11e3eab602b778e1dd1e281e7d1

--//对比反转后结果完全能对上.后面的chr(1)||chr(0)||chr(0)||chr(0)实际上与namespace有关.可以执行如下确定:
--//select distinct kglhdnsp,kglhdnsd,kglobtyd from x$kglob order by 1;

--//使用操作系统命令计算如下:

$ echo -e -n  'EMP.SCOTT\01\0\0\0' | md5sum | sed 's/  -//' | xxd -r -p | od -t x4 | sed  -n  -e 's/^0000000 //' -e 's/ //gp'
684ea11e3eab602b778e1dd1e281e7d1

--//可以发现完成能对上.

[20191127]表 full Hash Value的计算.txt的更多相关文章

  1. [20171227]表的FULL_HASH_VALUE值的计算.txt

    [20171227]表的FULL_HASH_VALUE值的计算.txt --//sql_id的计算是使用MD5算法进行哈希,生成一个128位的Hash Value,其中低32位作为HASH VALUE ...

  2. [20200211]使用DBMS_SHARED_POOL.MARKHOT与sql_id的计算.txt

    [20200211]使用DBMS_SHARED_POOL.MARKHOT与sql_id的计算.txt --//以前写的,使用DBMS_SHARED_POOL.MARKHOT标记热的sql_id,这样相 ...

  3. 哈希表(Hash Table)原理及其实现

    原理 介绍 哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映 ...

  4. OLAP 大表和小表并行hash join

    一个表50MB 一个表10GB 50M表做驱动表,放在PGA里 这时候慢在对对 10g 的全表扫描 对10个G扫描块 需要开并行 我有这样一个算法 一个进程 读 50mb 8进程 来 扫描 10gb ...

  5. oracle 表连接 - hash join 哈希连接

    一. hash 连接(哈希连接)原理 指的是两个表连接时, 先利用两表中记录较少的表在内存中建立 hash 表, 然后扫描记录较多的表并探測 hash 表, 找出与 hash 表相匹配的行来得到结果集 ...

  6. 哈希表(Hash Table)/散列表(Key-Value)

    目录 1. 哈希表的基本思想 2. 哈希表的相关基本概念 1.概念: 2.哈希表和哈希函数的标准定义: 1)冲突: 2)安全避免冲突的条件: 3)冲突不可能完全避免 4)影响冲突的因素 3. 哈希表的 ...

  7. 数据结构 -- 哈希表(hash table)

    简介   哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...

  8. 哈希表(hash table)基础概念

    哈希是什么 引入:我们在学习数组的时候,使用数组元素的下标值即可访问到该元素,所花费的时间是O(1),与数组元素的个数n没有关系,这就是哈希方法的核心思想. 哈希方法:以关键值K为自变量,通过一定的函 ...

  9. 哈希表(hash)详解

     哈希表结构讲解: 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. ...

随机推荐

  1. JavaScript基础4

    数组 创建数组  A.通过构造函数创建数组 * a): var arr=new Array();//定义一个空数组,无长度的空数组. * b):var arr1=new Array(num); * 当 ...

  2. HDU1561 The more ,The better (树形背包Dp)

    ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先 ...

  3. 基于RT-Thread的开源飞控StarryPilot

    背景描述 近年来无人机应用市场日趋火热,无人机开始被应用在多个领域之中,比如航拍,植保,运输,安防等.随着应用场景的增加,对于无人机的大脑一飞控,的性能和功能要求也变得越来越高.国内具有一大批优质的无 ...

  4. Fusion360_Generative Design 入门学习笔记

    2019.12.17更新 初次见到衍生式设计的时候感觉非常惊艳,现在觉得这个功能就是个弟弟,只能做一些中看不中用的东西.这个方法的理论基础是拓扑优化,想做research的同学可参阅"如何入 ...

  5. 面试题-JS中的作用域相关问题

    对象类型: 原始数据类型存储的是值,而对象类型存储的是地址(指针).下面的这个例子就比较有意思了. 先看题: function test(person) { person.age = 26 perso ...

  6. sql语句对int类型进行模糊查询

    重点:select * from course where cast(courseId as char) like '%118%'; 首先可以将int类型转换为string类型的值再进行模糊查询,用方 ...

  7. poj 2513 Colored Sticks (trie树+并查集+欧拉路)

    Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 40043   Accepted: 10406 ...

  8. [系列] Go 使用 defer 函数 要注意的几个点

    概述 defer 函数大家肯定都用过,它在声明时不会立刻去执行,而是在函数 return 后去执行的. 它的主要应用场景有异常处理.记录日志.清理数据.释放资源 等等. 这篇文章不是分享 defer ...

  9. d3.js 共享交换平台demo

    今天在群里遇到一张图  遂来玩一玩,先来上图!! 点击相应按钮,开关线路,此项目的重点是计算相应图形的位置,由于是个性化项目就没有封装布局.好了直接上代码. <!DOCTYPE html> ...

  10. c++-zoo动物园

    面向对象抽象类写动物园 animal animal.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include <iostream> u ...