首页 > 系统相关 >[20241021]使用gdb查看修改内存地址以及相关值.txt

[20241021]使用gdb查看修改内存地址以及相关值.txt

时间:2024-10-21 20:44:19浏览次数:7  
标签:count 0x00000000 内存地址 -- gdb book ---------- txt

[20241021]使用gdb查看修改内存地址以及相关值.txt

--//执行oradebug poke报错,感觉oracle已经禁止这类hack操作。

1.环境:
SYS@book> @ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0

PL/SQL procedure successfully completed.

2.问题提出:
SYS@book> oradebug setmypid
Statement processed.

SYS@book> @ opeek 00000000649AD2B8 32 1
New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_4208_0001.trc
Statement processed.
[0649AD2B8, 0649AD2D8) = 00000000 00000000 04C55EAC 0000D2E8 11280D5A 00000000 00000000 00000000

SYS@book>  oradebug poke 0x00000000649AD2B8 8 0x0000012700000127
ORA-32519: insufficient privileges to execute ORADEBUG command: execution of ORADEBUG commands is disabled for this instance

--//很明显oracle禁止这类操作,找到链接https://www.xifenfei.com/2016/07/oradebug-poke-ora-32521-ora-32519.html
--//可惜作者并没有讲如何实现的细节。不过gdb使用应该可以查看修改值,测试看看。

3.测试:
$ cat m1.txt
DECLARE
   v_pad   VARCHAR2 (200);
   l_count PLS_INTEGER;
BEGIN
    FOR i IN 1..&&1
    LOOP
       --EXECUTE IMMEDIATE 'select pad from t where id = :j ' INTO v_pad USING i;
       --EXECUTE IMMEDIATE 'select count(distinct pad) from t where id = :j ' INTO l_count USING i;
       EXECUTE IMMEDIATE 'select count(*) from t where id = :j ' INTO l_count USING i;
           --select count(*) into l_count from t where id = 1 ;
    END LOOP;
END;
/

$ zzdate;seq 10 | xargs -P 10 -IQ sqlplus -s -l scott/book@book01p @m1.txt 1e6 > /dev/null;zzdate
trunc(sysdate)+17/24+01/1440+49/86400 == 2024/10/20 17:01:49 === 2024-10-20 17:01:49== "timestamp'2024-10-20 17:01:49'"
trunc(sysdate)+17/24+02/1440+39/86400 == 2024/10/20 17:02:39 === 2024-10-20 17:02:39== "timestamp'2024-10-20 17:02:39'"

SYS@book> @ mutexprofz id,maddr,loc "ts>=trunc(sysdate)+17/24+01/1440+49/86400 and hash=1607470161"
-- MutexProf by Tanel Poder (http://www.tanelpoder.com)
-- Showing profile of top 20 sleeps...
-- display column info : id hash hash_value=>hash_value ts=>sleep_timestamp req=>requesting_session blk=>blocking_session val=>mutex_value maddr=>mutex_addr

SUM_SLEEPS           GETS MUTEX_TYPE              ID mutex_addr           GET_LOCATION                      OBJECT_NAME
---------- -------------- --------------- ---------- -------------------- --------------------------------- -------------------------------------
        11        1083007 Cursor Pin      1607470161 000000006EBCD060     kksLockDelete [KKSCHLPIN6]        select count(*) from t where id = :j
         5         327504 Cursor Pin      1607470161 000000006EBCD060     kksfbc [KKSCHLFSP2]               select count(*) from t where id = :j

SYS@book> @ opeek 000000006EBCD060 32 0
New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_5371_0013.trc
Statement processed.
[06EBCD060, 06EBCD080) = 00000000 00000000 02625BD0 00001D6B 5FD00C51 00000000 00000000 00000000

4.使用gdb查看是否可行:
(gdb) help x
Examine memory: x/FMT ADDRESS.
ADDRESS is an expression for the memory address to examine.
FMT is a repeat count followed by a format letter and a size letter.
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
  t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed
according to the format.

Defaults for format and size letters are those previously used.
Default count is 1.  Default address is following last thing printed
with this command or "print".

(gdb) x /8x 0x000000006EBCD060
0x6ebcd060:     0x00000000      0x00000000      0x02625bd0      0x00001d6b
0x6ebcd070:     0x5fd00c51      0x00000000      0x00000000      0x00000000
--//完全能对上oradebug peek的显示。

(gdb) x /4xg 0x000000006EBCD060
0x6ebcd060:     0x0000000000000000      0x00001d6b02625bd0
0x6ebcd070:     0x000000005fd00c51      0x0000000000000000
--//注意g格式显示问题,大小头对调。

5.使用gdb修改呢?
--//再次提醒这类操作小心,不小心可能导致crash以及数据库破坏,千万不要在生产系统做这类操作!!

--//看一些文档:
set *(unsigned char      *)<memaddr> = <value>  ; write 1 byte
set *(unsigned short     *)<memaddr> = <value>  ; write 2 bytes
set *(unsigned int       *)<memaddr> = <value>  ; write 4 bytes
set *(unsigned long long *)<memaddr> = <value>  ; write 8 bytes
or
set *(char      *)<memaddr> = <value>           ; write 1 byte
set *(short     *)<memaddr> = <value>           ; write 2 bytes
set *(int       *)<memaddr> = <value>           ; write 4 bytes
set *(long long *)<memaddr> = <value>           ; write 8 bytes

--//打开会话:
--//session 1:
SCOTT@book01p> @ spid
==============================
SID                           : 270
SERIAL#                       : 47427
PROCESS                       : 5719
SERVER                        : DEDICATED
SPID                          : 5721
PID                           : 66
P_SERIAL#                     : 20
C50                           : alter system kill session '270,47427' immediate;
PL/SQL procedure successfully completed.

--//sid=270 = 0x10e , 填充8位 0000010e。
(gdb) set *(unsigned long long *)0x000000006EBCD060 = 0x0000010e0000010e

(gdb) x /8xw 0x000000006EBCD060
0x6ebcd060:     0x0000010e      0x0000010e      0x02625bd0      0x00001d6b
0x6ebcd070:     0x5fd00c51      0x00000000      0x00000000      0x00000000

--//这样如果sid=270执行m1.txt脚本,会报错出现自锁,因为里面的blk的sid=270。
SCOTT@book01p> @ m1.txt 1
DECLARE
*
ERROR at line 1:
ORA-04024: self-deadlock detected while trying to mutex pin cursor 0x06C892E58
ORA-06512: at line 9

--//看报错信息。看看地址0x06C892E58在哪里?

SYS@book> @ fchaz 0x06C892E58
GET_LOCATION                      KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR         KSMCHPTR_BEGIN   KSMCHPTR_END+1
--------------------------------- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- -----------------
SGA                               000000006C892E28          1          1 KGLHD                   560 recr             80 00               000000006C892E28 000000006C893058

SYS@book> @ sharepool/shp4 '' 1607470161
HANDLE_TYPE            KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address   000000006C892E58 000000006B8B3430 select count(*) from t where id = :j              0          2          0 000000006BF4FFB8 000000006EBCD108       8128      16176       4214     28518      28518 1607470161 3qa9k69gx032j          0
parent handle address  000000006B8B3430 000000006B8B3430 select count(*) from t where id = :j              0          0          0 000000006CADC3A0 00                     4064          0          0      4064       4064 1607470161 3qa9k69gx032j      65535
--//指向child handle address,KGLHDADR=000000006C892E58。

(gdb) set *(unsigned long long *)0x000000006EBCD060 = 0x000001050000010e
(gdb) x /8xw 0x000000006EBCD060
0x6ebcd060:     0x0000010e      0x00000105      0x02625bd0      0x00001d6b
0x6ebcd070:     0x5fd00c51      0x00000000      0x00000000      0x00000000
--//注意看x的输出,大小头问题,0x00000105在后,0x0000010e在前。
--//如果害怕出错,可以采用4字节修改方式。set *(int       *)<memaddr> = <value>  ; write 4 bytes

--//session 1:
SCOTT@book01p> @ m1.txt 1

--//挂起!!说明第4-7字节表示blk会话。

(gdb) set *(unsigned int       *)0x000000006EBCD064 = 0x00000000
No type named unsigned signed int.
--//嗯,报错!!尝试set *( int       *)修改看看。

(gdb) set *( int       *)0x000000006EBCD064 = 0x00000000
--//注意我输入的地址是0x000000006EBCD064.

--//session 1:
SCOTT@book01p> @ m1.txt 1
PL/SQL procedure successfully completed.

(gdb) x /8xw 0x000000006EBCD060
0x6ebcd060:     0x0000010e      0x00000000      0x02625bd2      0x00006b5b
0x6ebcd070:     0x5fd00c51      0x00000000      0x00000000      0x00000000

(gdb) set *( int       *)0x000000006EBCD060 = 0x00000000
(gdb) x /8xw 0x000000006EBCD060
0x6ebcd060:     0x00000000      0x00000000      0x02625bd2      0x00006b5b
0x6ebcd070:     0x5fd00c51      0x00000000      0x00000000      0x00000000
--//前面4位表示共享模式获取的mutex的数量。


标签:count,0x00000000,内存地址,--,gdb,book,----------,txt
From: https://www.cnblogs.com/lfree/p/18490329

相关文章

  • 基于x86_64汇编语言简单教程5: 寻址模式与gdb调试
    目录寻址模式gdb调试示例文件打断点办法1:给函数名称和行号打上断点办法2:在地址上打断点打印变量layout命令打印十六进制(特殊)countformatsize再次介绍mov寻址模式我们无非就是频繁的跟数据自己打交道,那么问题来了,我们可以如何找到这些数据呢?这就是我们这篇教......
  • [20241018]21c x$mutex_sleep_history记录的变化.txt
    [20241018]21cx$mutex_sleep_history记录的变化.txt--//mutex很少会成为主要等待事件,如果遇到多数情况非常特别,比如bug。mutex本身和保护对象是一体的,不像latch一样有单独的--//latch,而且mutex本身占内存也更小,mutex没有等待和持有队列,所以没有排队机制,mutex具有共享和排它......
  • 012集——CAD图中线段坐标导出到txt(CAD—C#二次开发入门)
    如图所示,CAD图中line和pline坐标和图层数据导出到txt文本。 程序运行后导出如下文件:附部分源代码:publicstaticvoidDwgToTxt(thisDatabasedb){//vardb=Z.db;vared=Z.ed;//Point3dpt;BlockDatadata=newBlockData();List<Bloc......
  • 013集——txt格式坐标转为dwg图(CAD—C#二次开发入门)
    如上图类似格式坐标(上图为随机输入数字,不涉及真实坐标数据) 加载dll文件,输入netload加载此插件,根据对话框提示打开txt文件,即可生成多段线,如下图:附部分代码:publicstaticvoidTxtToDwg(thisDatabasedb){Editored=Z.ed;OpenFileDialogofd;DialogResu......
  • vue实战指南 vue中使用fetch读取本地txt文件
    vue实战指南vue中使用fetch读取本地txt文件基本概念与作用fetchAPI本地文件读取技术实现示例一:基本的fetch请求示例二:处理异步加载状态示例三:使用生命周期钩子示例四:读取多个文件示例五:使用Vuex管理文件内容实际工作中的一些技巧在Vue.js应用开发中,有时我们需要......
  • txtai: 一个强大的开源嵌入式数据库和语言模型工作流框架
    txtaitxtai:强大的开源嵌入式数据库和语言模型工作流框架txtai是一个功能强大的开源嵌入式数据库和语言模型工作流框架,由NeuML团队开发。它为构建语义搜索、大语言模型(LLM)应用和智能工作流提供了一站式解决方案。主要特性txtai具有以下主要特性:......
  • [20241016]Oracle C functions annotations补充.txt
    [20241016]OracleCfunctionsannotations补充.txt--//网站orafun.info可以查询oraclecfunctions.CreatedbyFritsHooglandwithalittlehelpfromKamilStawiarski.--//可以通过它了解oracle内部C函数.实际上可以直接下载相关文件,在本地使用.https://gitlab.com/Frits......
  • MP4 转 TXT 项目与 M3U8 下载脚本
    项目背景在当今信息社会,视频学习已成为一种重要的知识获取方式。然而,许多用户在观看视频的过程中,效率往往低于预期。为了提升学习效率,我们决定开发一个将MP4视频转换为TXT文稿的项目。此外,很多视频在微信网页上播放,无法直接下载,主要采用M3U8格式进行流式传输。这促使我们寻......
  • GDB
    gdb小南梁功能强大的程序调试器补充说明gdb命令 包含在GNU的gcc开发套件中,是功能强大的程序调试器。GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。语法gdb(选项)(参数)选项-cd:设置工作目录;-q:安静模式,不打印介绍信息......
  • 循序渐进丨MogDB 数据库查询重写规则lazyagg详解
    问题概述在MogDB和openGauss中,参数rewrite_rule用于控制查询重写,本文介绍查询重写规则lazyagg。在未设置rewrite_rule=lazyagg的情况下,子查询中有GROUPBY会先进行GROUPBY;lazyagg表示延迟聚合运算,目的是消除子查询中的聚合运算,先关联再GROUPBY;当子查询中有GROUPBY,子......