ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 从底向上第八篇--伪造基于ASSM表空间的数据块

从底向上第八篇--伪造基于ASSM表空间的数据块

原创 Linux操作系统 作者:sundog315 时间:2010-06-25 14:54:14 0 删除 编辑
从底向上第一篇--了解DML操作
从底向上第二篇--了解行迁移
从底向上第三篇--了解index的compress
从底向上第四篇--了解行链接
从底向上第五篇--了解表的压缩属性
从底向上第六篇--compress for oltp真正压缩的阈值触发条件
从底向上第七篇--超255列表的存储
从底向上第八篇--伪造基于ASSM表空间的数据块

突发奇想,既然Oracle数据块的格式我们基本都能了解,那么,伪造一个数据块也应该是可行的,做个实验,测试一下

SQL> conn test/test
已连接。
SQL> create table t as select * from dba_objects where rownum=1;

表已创建。

SQL> select count(*) from t;

  COUNT(*)
----------
         1

SQL> alter system checkpoint;

系统已更改。

SQL> select header_file,header_block from dba_segments where segment_name='T';

HEADER_FILE HEADER_BLOCK                                                        
----------- ------------                                                        
          4          130                                                        

SQL> alter system dump datafile 4 block min 128 block max 131;

系统已更改。

Dump of First Level Bitmap Block
--------------------------------
   nbits : 4 nranges: 1         parent dba:  0x01000081   poffset: 0     
   unformatted: 4       total: 8         first useful block: 3      
   owning instance : 1
   instance ownership changed at
   Last successful Search
   Freeness Status:  nf1 0      nf2 0      nf3 0      nf4 0      

   Extent Map Block Offset: 4294967295
   First free datablock : 4      
   Bitmap block lock opcode 0
   Locker xid:     :  0x0000.000.00000000
   Inc #: 0 Objd: 68305
  HWM Flag: HWM Set
      Highwater::  0x01000084  ext#: 0      blk#: 4      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 4     
  mapblk  0x00000000  offset: 0     
  --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x01000080  Length: 8      Offset: 0      
  
   0:Metadata   1:Metadata   2:Metadata   3:FULL
   4:unformatted   5:unformatted   6:unformatted   7:unformatted
  --------------------------------------------------------

  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8     
                  last map  0x00000000  #maps: 0      offset: 2716  
      Highwater::  0x01000084  ext#: 0      blk#: 4      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 4     
  mapblk  0x00000000  offset: 0     
                   Unlocked
  --------------------------------------------------------
  Low HighWater Mark :
      Highwater::  0x01000084  ext#: 0      blk#: 4      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 4     
  mapblk  0x00000000  offset: 0     
  Level 1 BMB for High HWM block: 0x01000080
  Level 1 BMB for Low HWM block: 0x01000080
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x01000081
  Last Level 1 BMB:  0x01000080
  Last Level II BMB:  0x01000081
  Last Level III BMB:  0x00000000
     Map Header:: next  0x00000000  #extents: 1    obj#: 68305  flag: 0x10000000
  Inc # 0
  Extent Map
  -----------------------------------------------------------------
   0x01000080  length: 8     
  
  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x01000080 Data dba:  0x01000083
  --------------------------------------------------------
  
   Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x01000081


Block 128 First Level Bitmap,可以看到,现在只格式化了0-3的块,我准备构造一个新块,放入块6中
用dd来实现:

C:\Users\Administrator>dd if=C:\oracle\app\Administrator\oradata\TEST\USERS01.DB
F f=aaa.block bs=8192 count=1 skip=131
1+0 records in
1+0 records out

C:\Users\Administrator>dd f=C:\oracle\app\Administrator\oradata\TEST\USERS01.DB
F if=aaa.block bs=8192 count=1 seek=134 conv=notrunc
1+0 records in
1+0 records out

这样,构造了一个与131完全相同的新块,并放入134中。

然后,用BBED修改块128如下内容:
unformatted、Highwater、blk#、#blocks below,以及将6:unformatted修改为format状态。

修改完毕的块128:


Dump of First Level Bitmap Block
--------------------------------
   nbits : 4 nranges: 1         parent dba:  0x01000081   poffset: 0     
   unformatted: 3       total: 8         first useful block: 3      
   owning instance : 1
   instance ownership changed at
   Last successful Search
   Freeness Status:  nf1 0      nf2 0      nf3 0      nf4 0      

   Extent Map Block Offset: 4294967295
   First free datablock : 4      
   Bitmap block lock opcode 0
   Locker xid:     :  0x0000.000.00000000
   Inc #: 0 Objd: 68305
  HWM Flag: HWM Set
      Highwater::  0x01000087  ext#: 0      blk#: 7      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 7     
  mapblk  0x00000000  offset: 0     
  --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x01000080  Length: 8      Offset: 0      
  
   0:Metadata   1:Metadata   2:Metadata   3:FULL
   4:unformatted   5:unformatted   6:75-100% free   7:unformatted
  --------------------------------------------------------


同样的,用BBED修改块130(Extent Control Header)的Highwater相关内容。

由于我们是将块131拷贝到134中,还需要修改134的DBA值。由01000083修改为01000086


Dump of memory from 0x0E2E8200 to 0x0E2EA200
E2E8200 0000A206 01000086 007A91B0 04020000  [..........z.....]
E2E8210 0000CC7F 00000001 00010AD1 007A91AE  [..............z.]
E2E8220 00000000 00320003 01000080 0000FFFF  [......2.........]
E2E8230 00000000 00000000 00000000 00008000  [................]
E2E8240 007A91AE 00000000 00000000 00000000  [..z.............]
E2E8250 00000000 00000000 00000000 00000000  [................]
        Repeat 1 times
E2E8270 00000000 00000000 00000000 00010100  [................]
E2E8280 0014FFFF 1F1F1F33 00001F1F 1F330001  [....3.........3.]
E2E8290 00000000 00000000 00000000 00000000  [................]
        Repeat 496 times
E2EA1A0 00000000 00000000 00000000 2C000000  [...............,]
E2EA1B0 53030E00 49055359 244C4F43 15C102FF  [...SYS.ICOL$....]
E2EA1C0 0503C102 4C424154 6E780745 3A0D1905  [....TABLE.xn...:]
E2EA1D0 6E78071C 3A0D1905 3032131C 302D3031  [..xn...:..2010-0]
E2EA1E0 35322D35 3A32313A 323A3735 41560537  [5-25:12:57:27.VA]
E2EA1F0 0144494C 014E014E 02C1024E 91B00602  [LID.N.N.N.......]

至此,修改完毕。我们来看看效果:

SQL> alter system flush buffer_cache;

系统已更改。
SQL> alter session set events '10202 trace name context forever';

会话已更改。

SQL> select count(*) from t;

  COUNT(*)
----------
         2

成功了。

SQL> alter session set events '10202 trace name context off';

会话已更改。

Consistent read complete...
Block header dump:  0x01000083
Object id on Block? Y
seg/obj: 0x10ad1  csc: 0x00.7a91ae  itc: 3  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000080 ver: 0x01 opc: 0
     inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn 0x0000.007a91ae
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
Consistent read complete...
Block header dump:  0x01000086
Object id on Block? Y
seg/obj: 0x10ad1  csc: 0x00.7a9138  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000080 ver: 0x01 opc: 0
     inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000d.01c.000002c2  0x03422891.03b0.1e  --U-    1  fsc 0x0000.007a913a
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000


模拟测试完成,我们直接从底层伪造了一个合法的数据块。

[ 本帖最后由 sundog315 于 2010-6-25 14:49 编辑 ]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/19423/viewspace-666274/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-01-05

  • 博文量
    126
  • 访问量
    503793