gdb调试若干问题

1.若干命令速查

  • file <文件名>:加载被调试的可执行程序文件。因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。示例:(gdb) file gdb-sample

  • r:Run的简写,运行被调试的程序,也是重启程序运行。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。

  • c:Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。

  • b <行号>:   b <函数名称>/   b *<函数名称>/b *<代码地址>,b: Breakpoint的简写,设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。

  • set args [parameter]:db调试的时候,设置命令行参数。

  • bt:bt可以去查看堆栈信息。down和up和一个一个打印堆栈信息。bt直接打印全部堆栈信息。

  • n:单步调试.执行完后显示的是下一条命令。

  • s单步进入

  • finish:如果想让程序执行到当前函数返回之后停止,用finish,当前函数的剩余语句将会正常运行。

  • 保存断点:save breakpoint fig8.3.bp;输入断点:gdb fig8.3 -x fig8.3.bp(-x参数)
  • gcc 编译有源码情况,调试带源码。gcc x.c -o x -g
  • nm可以查看程序函数固定偏移和符号表情况
  • gdb attach pid:attach已经运行的进程。i locals 查看变量值。
  • readelf -a xx;查看xx内存数据分布情况
  • 内存映射: i proc m (info proc mappings 的简写)核查零是不是有效地址
  • gdb高级用法:http://blog.jobbole.com/107759/
  • gdb执行文件中的命令(批处理):source -v file.txt
  • 查看pe映射:cat /proc/28124/maps。相当于vmmap更全。
  • 解决gdb调试分页问题:type return to continue,or q <return> to quit:set pagination off

2.查看程序安全特性:

  • peda命令:checksec,可以看到NX是否启用。
  • linux系统查看是否开启aslr:cat /proc/sys/kernel/randomize_va_space 2
  • 查看程序加载机制,或者分布图,三种方法:
    • info sharedlibrary
    • peda:vmmap
    • pmap -x pid:更全面

1.gdbserver远程调试

gdbserver 192.168.16.1:7678 ./over//若有参数,加上参数。

//这是gdbserver启动程序运行。另外一种是attach方式:./gdbserver :12345 --attach 3334 &//&表明后台运行
gdb ./over
target remote 192.168.16.1:7678
continue
info sharedlibrary :查看加载的模块

以调试lampp中apache httpd为例:

(1).gdbserver单进程启动httpd:gdbserver :12345 ./httpd -X

(2).gdb挂上:gdb ./httpd

(gdb) target remote 127.0.0.1:12345
Remote debugging using 127.0.0.1:12345
Reading /lib64/ld-linux-x86-64.so.2 from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /lib64/ld-linux-x86-64.so.2 from remote target...
Reading symbols from target:/lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/.build-id/e7/d1cfa2253c89a2f4ad9588f8db4f1c1fc58467.debug...done.
done.//这里可以看到是有符号文件的。
0x00007ffff7dd9cc0 in _start () from target:/lib64/ld-linux-x86-64.so.2

(gdb) b ap_process_request

(gdb) continue

Reading /opt/lampp/lib/libpcre.so.0 from remote target...//注意gdb是从远程读取so文件
Reading /opt/lampp/lib/libaprutil-1.so.0 from remote target...

(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007ffff7dd9ac0 0x00007ffff7df53c0 Yes target:/lib64/ld-linux-x86-64.so.2
0x00007ffff7bbd230 0x00007ffff7bd3ec8 Yes (*) target:/opt/lampp/lib/libpcre.so.0
0x00007ffff799f030 0x00007ffff79b50c8 Yes (*) target:/opt/lampp/lib/libaprutil-1.so.0
0x00007ffff776d9f0 0x00007ffff7789568 Yes (*) target:/opt/lampp/lib/libexpat.so.1
0x00007ffff7487370 0x00007ffff749c618 Yes (*) target:/opt/lampp/lib/libiconv.so.2
0x00007ffff7262f60 0x00007ffff727ca68 Yes (*) target:/opt/lampp/lib/libapr-1.so.0
0x00007ffff7051100 0x00007ffff7053ecf Yes target:/lib/x86_64-linux-gnu/librt.so.1

2.其他命令

nm - list symbols from object files

objdump  -tT libgd.so//查看无符号情况

3.gdb断点高级技巧

转:http://blog.csdn.net/zhangmiaoping23/article/details/41009053

条件断点

设置一个条件断点,条件由cond指定;在gdb每次执行到此断点时,cond都被计算。当cond的值为非零时,程序在断点处停止。

用法:break [break-args] if (condition)

例如:

break main if argc > 1
break 180 if (string == NULL && i < 0)
break test.c:34 if (x & y) == 1
break myfunc if i % (j+3) != 0
break 44 if strlen(mystring) == 0
b 10 if ((int)$gdb_strcmp(a,"chinaunix") == 0)
b 10 if ((int)aa.find("dd",0) == 0)

condition

可以在我们设置的条件成立时,自动停止当前的程序,先使用break(或者watch也可以)设置断点,然后用condition来修改这个断点的停止(就是断)的条件。

用法:condition <break_list> (conditon)

例如:
cond 3 i == 3

condition 2 ((int)strstr($r0,".plist") != 0)

ignore

如果我们不是想根据某一条件表达式来停止,而是想断点自动忽略前面多少次的停止,从某一次开始才停止,这时ignore就很有用了。

用法:ignore <break_list> count。上面的命令行表示break_list所指定的断点号将被忽略count次。例如:ignore 1 100,表示忽略断点1的前100次停止

为断点设置命令列表

设置一个断点并且在上面中断后,我们必须会查询一些变量或者做一些其他动作。如果这些动作可以一起呵成,岂不妙哉!使用命令列表(commands)就能实现这个功能。

步骤:
1.建立断点。2.使用commands命令

用法:
commands <break_list>

例如:
(gdb) commands 1
Type commands for when breakpoint 1 is hit,one per line.
End with a line saying just "end".
>silent
>print "n= %d \n",n
>continue
>end

文件记录 :断点2在open函数开头

(gdb) commands 2
Type commands for when breakpoint 2 is hit,one per line.
End with a line saying just "end".
>x/s $r0
>continue
>end

如果遇到指针情况,一定要先转化,例如push [ebp-0x24];

则为x/s *(int *)(ebp-0x24)

---------------------------------------------------------------------------

4. GDB寄存器和内存 :转:http://blog.chinaunix.net/uid-22315114-id-99972.html

  • 查看寄存器

(gdb) i r
(gdb) i r a                     # 查看所有寄存器(包括浮点、多媒体)
(gdb) i r esp
(gdb) i r pc

  • 查看内存

(gdb) x /wx 0x80040000    # 以16进制显示指定地址处的数据
(gdb) x /8x $esp
(gdb) x /16x $esp+12
(gdb) x /16s 0x86468700   # 以字符串形式显示指定地址处的数据
(gdb) x /24i 0x8048a51      # 以指令形式显示指定地址处的数据(24条)

  • 修改寄存器的值

(gdb) set $v0 = 0x004000000
(gdb) set $epc = 0xbfc00000

  • 修改内存的值

(gdb) set {unsigned int}0x8048a51=0x0
(gdb) set *(unsigned int*)0x8048a54=0x55aa55aa

  • 内存搜索

Usage: find <start> <end> <count> <value>
(gdb) define find                             
set $ptr = $arg0
set $cnt = 0
while ( ($ptr<=$arg1) && ($cnt<$arg2) )
    if ( *(unsigned int *)$ptr == $arg3 )
        x /wx $ptr
        set $cnt = $cnt + 1
    end
    set $ptr = $ptr + 4
end
end

  • 断点、监测点

(gdb) b *0x80400000
(gdb) watch *(unsigned int *)0xbffff400==0x90909090

  • gdb调试有参数的程序:下面可以使用两种方法输入命令行参数

      1)run  命令行参数

      2)set args  命令行参数

  • gdb查看main函數:

    (gdb) b main
    Breakpoint 1 at 0x40072a
    (gdb) x/16i main

 

fork多进程调试一般有一下3种方法:

转:http://blog.csdn.net/fingding/article/details/46459095

1. follow-fork-mode

用法:set follow-fork-mode [parent|child] 
进入gdb后,直接设置,默认是parent
所以如果想要调试子进程,进入gdb后设置set follow-fork-mode child,然后设置子进程的断点
可用使用show follow-fork-mode 来查询当前fork模式
使用follow-fork-mode,只能调试一个进程,不能同时调试父子进程
2. detach-on-fork mode
用法:set detach-on-fork [on|off]
on: 只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。
off: 父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定),另一个进程会被设置为暂停状态。
如果设置了set detach-on-fork off且follow-fork-mode为parent,fork后子进程并不运行,而是处于暂停状态。
注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。
3. attach后多进程调试
上述方法还是不能同时调试两个进程,假设调试主进程,fork后,子进程已经不知道运行到何处了,所以这就需要让子进程先暂停一下。暂停的方法有很多
1> 最简单的就是sleep一下
else if(fpid == 0)  {// child process
sleep(10); // 给你足够的时间去find子进程id(pstree -ap |  grep a.out),然后attach 
}
2> 加一段等待代码
  1. void debug_wait(char *tag)  
  2. {  
  3.     while(1)  
  4.     {  
  5.         if (tag存在) <span style="color:#ff0000;">// tag可以是一个环境变量,也可以是一个文件等</span>  
  6.             睡眠一段时间;  
  7.         else  
  8.             break;  
  9.     }  

peda

PEDA - Python Exploit Development Assistance for GDB

Key Features:

  • Enhance the display of gdb: colorize and display disassembly codes, registers, memory information during debugging.
  • Add commands to support debugging and exploit development (for a full list of commands use peda help):
    • aslr -- Show/set ASLR setting of GDB
    • checksec -- Check for various security options of binary
    • dumpargs -- Display arguments passed to a function when stopped at a call instruction
    • dumprop -- Dump all ROP gadgets in specific memory range
    • elfheader -- Get headers information from debugged ELF file
    • elfsymbol -- Get non-debugging symbol information from an ELF file
    • lookup -- Search for all addresses/references to addresses which belong to a memory range
    • patch -- Patch memory start at an address with string/hexstring/int
    • pattern -- Generate, search, or write a cyclic pattern to memory
    • procinfo -- Display various info from /proc/pid/
    • pshow -- Show various PEDA options and other settings
    • pset -- Set various PEDA options and other settings
    • readelf -- Get headers information from an ELF file
    • ropgadget -- Get common ROP gadgets of binary or library
    • ropsearch -- Search for ROP gadgets in memory
    • searchmem|find -- Search for a pattern in memory; support regex search
    • shellcode -- Generate or download common shellcodes.
    • skeleton -- Generate python exploit code template
    • vmmap -- Get virtual mapping address ranges of section(s) in debugged process
    • xormem -- XOR a memory region with a key

Installation

git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
echo "DONE! debug your program with gdb and enjoy"

Screenshot

start

pattern arg

patts

转载于:https://www.cnblogs.com/studyskill/p/6609530.html

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

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

相关文章

java线程中的notifyAll唤醒操作

注意&#xff1a; java中的notifyAll和notify都是唤醒线程的操作&#xff0c;notify只会唤醒等待池中的某一个线程&#xff0c;但是不确定是哪一个线程&#xff0c;notifyAll是针对指定对象里面的所有线程执行唤醒操作&#xff0c;指定对象一旦唤醒成功。则会立即加入线程的资源…

阻止html页面加载,如何防止页面加载重复的JS?

我自己写了一个页面&#xff0c;除了公共部分的页头页脚以外&#xff0c;其余内容都是通过Ajax加载过来的&#xff0c;现在遇到了比较头疼的问题&#xff1a;先说一下我加载的方式$.ajax({type : "GET",url : hrefPage,dataType : html,cache : true, // (warning: t…

IIS的安装与配置

安装IIS 若操作系统中还未安装IIS服务器&#xff0c;可打开“控制面板”&#xff0c;然后单击启动“添加/删除程序”&#xff0c;在弹出的对话框中选择“添加/删除Windows组件”&#xff0c;在Windows组件向导对话框中选中“Internet信息服务&#xff08;IIS&#xff09;”&…

ie11不兼容 html编辑器,ie11兼容性视图护驾浏览网页

安装 ie11 后&#xff0c;原来的在线网页编辑器不能粘贴、也不能插入图片了&#xff0c;有些网站也不能登录&#xff0c;怪不适用的&#xff0c;无奈只能启用ie11兼容模式。把显示或操作不正常的网站添加到兼容性视图后&#xff0c;又可以操作了&#xff0c;好在ie有兼容模式&a…

gitlab用户添加ssh免密钥认证后clone还是要求输入密码

今天在centos 7公网服务器上安装gitlab在配置ssh免密钥时遇到一个奇怪的事&#xff0c;正确添加了本机的公钥到gitlab账户上&#xff0c;进行clone时死活都要你输入密码gitlab使用yum安装的&#xff0c;之前在vmware虚机上的一台centos 7安装也没有这个问题根据这个文章的思路进…

yii源码学习心得

1.通过看源代码&#xff0c;对yii的框架学习有了更多的认识和理解 assets 前端资源文件夹&#xff0c;用于管理css js等前端资源文件等 commands 包含命令行命令&#xff0c;文件为控制器文件 config 应用的配置文件 controllers 控制器文件 mail &#xff08;应用的前后台…

consul删除无效服务

curl http://server_ip:8500/v1/agent/service/deregister/paas-portal-sit-9003 -X PUT 删除无效服务&#xff1a; paas-portal-sit-9003 为服务名称 页面上进入服务详单(/ui/dc1/services/xxx)从这里找 删除无效节点&#xff1a; http://server_ip:8500/v1/agent/force-l…

英语四级真题作文 计算机,2019年6月大学英语四级作文范文50例:电脑

新东方在线英语四级频道为备考英语四级的同学们整理了英语四级作文范文&#xff0c;希望可以为大家带来帮助&#xff0c;一起来学习一下吧。Computers in Students’ Flats1. 现在大学生宿舍几乎人手一台电脑2. 有些人认为会促进学生的学习&#xff0c;有些人认为会影响学生的学…

java 抽象方法

int 是基本数据类型Integer是其包装类&#xff0c;注意是一个类。为什么要提供包装类呢&#xff1f;&#xff1f;&#xff1f;一是为了在各种类型间转化&#xff0c;通过各种方法的调用。否则 你无法直接通过变量转化。比如&#xff0c;现在int要转为Stringint a0;String resul…

1前端学习(2345):关于前端对于xml格式文件的渲染

一、xml和json对比 xml:扩展标记语言&#xff0c;     优点&#xff1a;格式统一&#xff0c;格式标准&#xff0c;容易与其他系统远程交互&#xff0c;数据共享比较方便     缺点&#xff1a;xml文件庞大&#xff0c;格式复杂&#xff0c;解析会花费大量时间和资源&am…

计算机网络管理员demo,计算机网络试题demo

计算机网络试题demo 1 北京交通大学 2006-2007 学年 第二学期考试试题 课程名称&#xff1a;计算机通信与网络技术 班级&#xff1a;电气 05 出题人&#xff1a;网络课程组 题 号 一 二 三 四 五 总分 得 分 签 字 一&#xff0e; 选择题(每题1 分&#xff0c;共20 分) 1&#…

什么是流程控制

浅析PHP流程控制 今天Qi号给小白们分享一下PHP基础(相互请教&#xff5e;&#xff5e;)&#xff1a; 下面是Qi号搜集的资料及自己的总结希望有所帮助&#xff1a; 什么是流程控制&#xff1a;在声明式的编程语言中&#xff0c;流程控制指令是指会改变程序运行顺序的指令&#x…

Win10系列:JavaScript页面导航

页面导航是在开发应用的过程中使用频率较高的技术&#xff0c;其中比较常用的导航方式有多页导航和页内导航&#xff0c;采用多页导航方式的应用程序包含一系列的页面&#xff0c;在一个页面中加入另一个页面的链接地址后&#xff0c;单击链接将跳转到指定页面&#xff0c;从而…