首页
学习
活动
专区
圈层
工具
发布

GDB的那些奇淫技巧

当然目标程序是没有符号的,而且我希望下的断点是一个动态地址。在 lldb 中有--wait-for,gdb 里却没有对应的命令,经过多次摸索,终于总结出一个比较完美的解决方案。...我一般使用的方式是在调用 gdb 时指定,比如: $ env CONTENT_TYPE="$(python -c "print 'A'*10 + '\x04\x03\x02\x01'")" gdb demo...由于 gdb 本身支持 python 接口,因此现实中使用通常结合一些拓展使用,比如: gef: https://github.com/hugsy/gef pwndbg: https://github.com...{regexp} 打印函数名称 info variables {regexp} 打印全局变量名称 ptype name 查看类型定义,比如 ptype FILE,查看 FILE 结构体定义 whatis...shell {command} [args] 执行 shell 命令 source {file} 从文件加载 gdb 命令 quit 退出 gdb

1.8K20

GDB 调试笔记

(gdb) c b b 名称>b \*名称>b \*地址> d [编号] b: Breakpoint的简写,设置断点。...两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。其中在函数名称前面加“\*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。...所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。 (gdb) si(gdb) ni p 名称> Print的简写,显示指定变量(临时变量或全局变量)的值。...undispaly,取消先前的display设置,编号从1开始递增。...补充小工具 python dbg工具,可以通过 apt-get install -y python-dbg 进行安装,然后可以在其中使用 py-bt 、 py-list 等命令。

1.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    二进制学习

    代码交叉引用比如图形界面程序获取用户输入,就可以使用对应的 windowsAPI 函数,我们就可以通过这些 API 函数调用位置找到关键代码。...比如使用一些 API 函数如IsDebuggerPresent检测调试器,使用SEH异常处理,时间差检测等方法。也可以通过覆写调试端口、自调试等方法进行保护。...本身的弱点,当__stack_check_fail时,会打印出正在运行中程序的名称,所以,我们只要将__libc_argv[0]覆盖为flag的地址就能将flag打印出来,比如这个题目: http://...{regexp} 打印函数名称 info variables {regexp} 打印全局变量名称 ptype name 查看类型定义,比如 ptype FILE,查看 FILE 结构体定义 whatis...shell {command} [args] 执行 shell 命令 source {file} 从文件加载 gdb 命令 quit 退出 gdb pwndbg 用法特性:https://github.com

    1.3K20

    2025年CTF竞赛逆向工程中难度真实题目解析

    "的代码地址) # 假设这个地址是0x401245 AVOID_ADDR = 0x401245 # 运行符号执行,寻找能够到达目标地址的路径 simgr.explore(find=TARGET_ADDR...工具推荐: IDA Pro:强大的静态分析工具 Python:编写解密脚本 GDB:动态调试程序 angr:二进制分析框架,支持符号执行 题目4:混淆的算法识别 题目描述:这个程序使用了代码混淆技术来隐藏其真实的加密算法...)从程序中提取资源数据 使用IDA Pro的资源查看功能查看程序中的资源 在Linux/MacOS上,可以使用wine运行程序,然后使用winedbg进行调试 这里我们使用IDA Pro的资源查看功能来获取...有几种方法可以获取flag: 使用网络抓包工具(如Wireshark、tcpdump)捕获程序的HTTP请求和响应 使用GDB调试程序,在write_callback函数中查看API响应的内容 分析程序是否在本地构造了...# 查看ptr参数(指向API响应数据) x/s (char*)ptr 假设从调试中看到API响应的内容是flag{API_Call_Analysis} 获取flag:flag{API_Call_Analysis

    36110

    Android基础开发实践:如何分析Native Crash

    栈帧号:#00 2. pc地址值:pc 0004b3ac 3. 对应的虚拟内存映射区域名称(通常是共享库或可执行文件):/system/lib/libc.so 4....如果出现无法解析的现象,可能是因为当前符号表so与实际出现Crash的so不匹配(比如使用新代码编译的带符号表的so)。...查找到符号起始地址,然后再加上调用栈中的偏移量(比如上面例子中的1298),然后将新的地址给addr2line进行解析。...还可以给gdb加上一个gui界面,比如基于浏览器的gdbgui: ? 这样我们就可以方便使用gdb进行各种调试了,比如查看变量值、地址是否空指针等等。...如果是因为加载so或者link so导致的问题,本人实现了几个脚本,可以方便地获取到so文件之间的依赖关系(便于确定加载so的顺序),以及从大量的so中查找特定符号或者Java 类名。

    19.2K154

    深入了解GOT,PLT和动态链接

    现在先看汇编的67c处, 通过eax+0x1c=0x201c获取了变量的值, 这个地址已经进入到了.data之中: $ gdb ....缺点 位置无关代码的缺点是, 在执行时要保留一个寄存器作为PIC寄存器, 有可能会导致寄存器不够用; 还有一个缺点是运行时要经过计算来获得 符号的地址, 从某种方面来说也对运行速度有点小影响.....got.plt相当于.plt的GOT全局偏移表, 其内容有两种情况, 1)如果在之前查找过该符号, 内容为外部函数的具体地址. 2)如果没查找过, 则内容为跳转回.plt的代码, 并执行查找....,如名称、地址、大小等。...例如: STRTAB + sym->st_name中包含该符号名称字符串的地址 st_other: 符号是否可见 pwndbg> x/32xw 0x80481cc 0x80481cc: 0x00000000

    2.3K10

    linux后台开发常用调试工具

    一、编译阶段 nm 获取二进制文件包含的符号信息 strings 获取二进制文件包含的字符串常量 strip 去除二进制文件包含的符号...对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空) -n 根据符号的地址来排序(默认是按符号名称的字母顺序排序的) -u 只列出未定义符号...参数: -a 在显示函数名或文件行号前显示地址 -b 指定二进制文件格式 -C 解析C++符号为用户级的名称,可指定解析样式 -e 指定二进制文件...-f 同时显示函数名称 -s 仅显示文件的基本名,而不是完整路径 -i 展开内联函数 -j 读取相对于指定节的偏移而不是绝对地址...(记录下,没用过) 全局变量的类型不一致的问题,现在还找到比较好的方法,这从另一个方面说明全局对象不是个好的设计,这给调试带来了麻烦。

    4.4K151

    面试官:Gdb 如何调试core文件

    腾讯一面:生产环境如何使用gdb调试Release发行版本的程序? 这篇文章写不行,重写一次。 一句话描述: 用gdb作用证明问题出现在哪里,哪个流程环境出现问题了。...单纯靠gdb无法解决问题 问:如果使用gdb解决core问题 下面是我的回答 假如产生core下面是我解决步骤 第一步:确定哪个服务产生core 假如 一台服务器上20个服务, 我怎么清楚那个服务出现问题...型号 (Model) / 型号名称 具体数值 / Hygon C86 XXX 指明CPU的具体型号,例如Hygon C86 7185或7285等 疑问 没有调试符号怎么办?...什么请看使用寄存器呢 隐藏知识:对cpu 而言 每个变量存储寄存器上,寄存器存储变量地址 变量名本质是程序员给某块内存或寄存器起的易记名字 info args 打印函数参数 info locals 打印当前栈帧的局部变量...地址--寄存器 是隐藏基本知识 为什么这么说 如果gdb 产生10G文件 被禁止后 怎么产生一个文件 记录这些信息呢 Core文件本质上是程序崩溃瞬间的完整内存镜像,包含: 所有变量值及其内存地址 CPU

    19410

    linux常用命令--开发调试篇

    查看函数或者全局变量是否存在于elf文件中--nm nm命令用于查看elf文件的符号信息。文件编译出来之后,我们可能不知道新增加的函数或者全局变量是否已经成功编译进去。...但是要特别注意的是,“瘦身”之后的elf文件由于没有了符号信息,许多调试命令将无法正常使用,出现core dump时,问题也较难定位,因此只建议在正式发布时对其进行“瘦身”。...另外,我们还注意到它的入口地址是0x400440(_start),而不是400540(main)。也就是说,我们的程序运行并非从main开始。...我们可以利用前面介绍的nm命令获取到函数test的地址,然后使用下面的方式反汇编: objdump -d cmdTest --start-address=0x40052d --stop-address=...有时候程序可能已经正在运行,但是又不能终止它,这时候仍然可以使用gdb调试正在运行的进程: gdb processFile PID #processFile为进程文件,pid为进程id,可通过ps命令查找到

    1.7K30

    linux-沙盒入门,ptrace从0到1

    2.反调试 我们直接通过攻防来学习ptrace反调试的应用 1.直接使用ptrace函数: 攻防(防): 进程跟踪器,类似于gdb watch的调试方法, Linux 系统gdb等调试器,都是通过ptrace...从图可以看到,即使使用strip 移除了符号表项信息,但是仍会保留.dynsym表的表项 .symtab和dynsym: 符号表类型 说明 .symtab 包含大量的信息(包括全局符号global symbols...) .dynsym 只保留.symtab中的全局符号 在可执行文件中,函数,变量都为符号,而符号表项所对应的就是地址(不牵扯glt,got表),.symtab和.dynsym这两个都是符号表,dynsym...是symtab的较小版本,仅包含全局符号,而symtab会保护这个程序所有符号,因此,也可以在symtab中找到在dynsym中所拥有的符号,但是你会有个疑问:可执行文件明明只需要一个symtab就够了...PTRACE_PEEKTEXT, PTRACE_PEEKDATA 从内存地址中读取一个字节,内存地址由addr给出 PTRACE_ATTACH 跟踪指定pid 进程 PTRACE_GETREGS 读取所有寄存器的值

    4.8K31

    046_逆向工程实战进阶:GDB动态调试技术全面详解与二进制程序分析实战指南

    它的核心功能包括: 程序控制:启动、暂停、继续、单步执行程序 断点管理:设置条件断点、硬件断点、临时断点等 内存检查与修改:查看和修改寄存器、内存内容 堆栈跟踪:分析函数调用栈和变量作用域 符号解析:加载和使用调试符号信息.../library 0x8048000 # 解析内存中的符号 info symbol 0x8048450 # 查找函数地址 print &function_name # 检查符号类型 whatis.../program 7.2 Python脚本集成 GDB支持Python脚本,提供更强大的自动化能力: # gdb_script.py import gdb # 定义自定义命令 class FindFunction...Python脚本: gdb -x gdb_script.py ....通过本文的学习,读者应该能够: 熟练使用GDB进行程序动态分析 设置各种类型的断点进行精确调试 检查和修改内存以绕过保护机制 使用脚本自动化重复的分析任务 应用GDB解决实际逆向工程问题 在实际的逆向工程工作中

    27610

    GDB调试学习

    gdb调试 能进行GDB调试,一般在编译过程中,需使用-g参数。如果不使用-g参数,则在gdb调试过程中,将不能得到程序的函数名、变量名等信息,而只能看见运行时内存地址。...举例如下: 启动gdb调试的方法有以下三种: 常用的调试有以下几种: b // 停在程序的指定一行 b 名称> // 停在程序的某个函数处 b *名称> // 停在编译器生成的prolog...p/print:打印指定变量(临时变量和全局变量)、字符串、表达式等值。 display …:设置程序中断后想显示的数据及其格式。...help [命令名称]:gdb帮助命令,提供对GDB各种命令的解释说明。如果指定了“命令名称”参数,则显示该命令的详细说明;若果没有指定参数,则分类显示所有GDB命令,共用户进一步浏览和查询。...cd dir:运行GDB,使用dir作为gdb的工作目录。 se File:从File读取符号表并把它作为可执行文件。 -write:开通enable往可执行文件和核心文件写的权限。

    1.8K20

    iOS小技能:__attribute__的应用

    I __attribute__的应用案例 1.1 代码注入 ARM (通过汇编调用svc实现用户态到内核态的转换) // 使用inline方式将函数在调用处强制展开,防止被hook和追踪符号 static...from a symbol * name to its replacement */ struct rebinding {//rebinding结构体 const char *name; //符号名称...void *replacement; //新函数的地址 void **replaced; //原始函数地址的指针!...//第二个参数为自己实现的函数名称 //第三个参数为原函数地址,因为fishhook是基于地址进行替换的+ `__attribute__((constructor))`实现注入 rebind_symbols...然后所有发送给被调试程序的信号(除SIGKILL)都会被gdb截获,gdb根据截获的信号,查看被调试程序相应的内存地址,并控制被调试的程序继续运行。

    54020

    Linux:断点原理与实现

    特别是经常使用 GDB 的童鞋,对它提供的强大功能更加如数家珍,其中就不乏 breakpoint(断点)。 刚好最近做到 Ptrace 相关的实验,也顺便撸了这篇小文来分享下 断点 当中的道理。...直接摘抄里面的一段描述: rip 指令地址寄存器,用来存储 CPU 即将要执行的指令地址。...实现思路 实现的思路非常简单 1. 先确定我们要断点的地址 在 GDB 中,我们是习惯对 行号 或者 函数名 直接设置断点,行号相对来说比较复杂,我们先展示 函数名 的。...这个符号表记录了进程需要用到的符号分别在什么位置。 如图,第一列就是符号的地址(十六进制),第二列是长度,最后一列是符号名字。...其实在文中提到的例子也有非常多可以优化的点: 比如:函数地址获取的方式,既然提到 ELF 的符号表,那么应该通过解析这个表,将用户传入的用户名,转换成地址; 再比如:应该维护一份全局的断点表,储存任意多的断点

    2.2K10

    GDB调试

    方式五:对运行中的a.out,可以先按方式二启动,然后在gdb中中心“attach 19475”调试运行中的a.out 进入到GDB后,可以通过help命令来获取帮助,GDB对命令做了分类,要获取详细说明可以查看...在GDB中当前可见的变量(全局变量、全局静态变量、当前作用域的局部变量)可以随时打印。format详细说明如下。...对这类问题最好在单元测试中用4.8.5以上的gcc打开地址消毒,或者用valgrind进行检测。 栈溢出:当在栈上分配很大的数组时很容易导致栈溢出,对于较大内存的使用最好是通过动态内存分配来获取。...问题四:全局符号介入 在《从四个问题透析Linux下C++编译&链接》中提到全局符号介入,这种问题通常会引起core dump,要定位相关问题需要对代码执行路径有一定了解,通过GDB反馈的当前帧符号来源来定位符号是否来自非预期的库中...对于某些飘忽不定的core dump,还要看是不是由于当前这次发布引入了错误版本的动态库?由于接口的变化导致类似全局符号介入的效果。

    2.7K10

    ELF文件从形成到加载轮廓

    .rela:重定位表,记录需要调整地址的符号引用位置,链接器根据此表修正地址。 .debug:调试信息,包含源代码行号、变量名和类型等,供调试工具(如 gdb)使用。...在调试阶段,符号表为调试工具(如 gdb)提供符号信息,映射源码中的标识符到内存地址,便于定位和分析。...FILE:源文件名称。 Binding:符号的绑定属性,常见绑定包括: LOCAL:本地符号,仅在当前文件可见。 GLOBAL:全局符号,可被其他文件引用。...调试阶段:调试工具(如 gdb)使用 .symtab 将源码中的函数名和变量名映射到内存地址,方便设置断点、查看变量值。...如何查看 .symtab 您可以使用以下命令查看符号表: 使用 nm 命令: $ nm hello.o # 查看目标文件的符号表 $ nm a.out # 查看可执行文件的符号表 - 输出显示符号名称

    1.1K10

    mold源码阅读十二 创建一些输出段

    randomization)时需要thunk动态计算目标地址 地址运行时才能确定时需要thunk计算地址 基本上都是一些无法直接跳转的情况,也因此会引入新的符号。...当全局符号降级为local的时候则不再对外可见,因此不再占用全局符号表的空间。...is_exported; } 对于relocatable来说,如果st_bind为STB_LOCAL,那么这个符号一定是local的 对于非imported以及非exported的全局符号,通常是模块内部实现细节使用...比如说有如下几种情况 静态全局符号,只能模块内部可见(因为静态符号的作用域限定在模块内,因此会被认为是local符号,对全局静态变量的访问只需要通过内存地址,而不需要符号名进行绑定) 匿名全局符号,没有被显示的使用...未使用的全局符号,不会被访问,同时会被优化掉 因此这些情况属于local,记入num_local_symtab 关于imported和exported的计算过程,可以参考之前第五期的文章,其中有根据可见性来设置

    37720

    使用gdb调试内核

    image (KASLR) 建议关闭地址随机化,否则会出现gdb中无法在断点处停下来的情况(尤其是qemu中)。...上启动gdb客户端后连接虚拟soc提供的gdb服务(终端不会有输出),命令如下: # 启动gdb,工具链中gdb的路径,并读取符号表 # vmlinux相当于elf文件,具有符号表。...使用gdb扩展 内核通过python脚本定义了一组gdb命令,可方便其对内核的调试,如通过该脚本可以打印dmesg,percpu变量,通过pid打印其对应的task_struct结构体等。...在gdb中可以读取该文件。 # 启动gdb,工具链中gdb的路径,并读取符号表 # vmlinux相当于elf文件,具有符号表。Image文件相当于bin文件。...命令加载内核和模块的符号表 lx-symbols # 就可以使用扩展指令了 # 查看支持的扩展指令 apropos lx # 设置断点 b start_kernel # 运行 c 使用’apropos

    2.1K50
    领券