【转】gdb的调试与使用
转载自:https://www.jianshu.com/p/7a06b0bda2d8
gdb的调试与使用
这篇应该是我见过的总结最详细的gdb调试指南了,这位博主是个很强的人,他的博客对萌新比较友好,我始终认为那种自己厉害又能把自己所学完美表达出来的人是最强的
1. 调试的快捷键
peda带有的功能,直接输入命令,其就会给予提示(如果不是这样,基本上也是该命令就可以不带参数)。这儿就不多做介绍
1.1 基础的调试快捷键
- s step,si步入
- n 执行下一条指令 ni步入
- b 在某处下断点,可以用
- b * adrress
- b function_name
- info b 查看断点信息
- delete 1删除第一个断点
- c 继续
- r 执行
- disas addr 查看addr处前后的反汇编代码,也可以是函数名字
1.2 显示数据
- p 系列
- p system/main 显示某个函数地址
- p $esp 显示寄存器
- p/x p/a p/b p/s。。。
- p 0xff - 0xea 计算器
- print &VarName 查看变量地址
- p * 0xffffebac 查看某个地址处的值
- p system/main 显示某个函数地址
- x系列
- x/xw addr 显示某个地址处开始的16进制内容,如果有符号表会加载符号表
- x/x $esp 查看esp寄存器中的值
- x/s addr 查看addr处的字符串
- x/b addr 查看addr处的字符
- x/i addr 查看addr处的反汇编结果
- info系列
- info register $ebp 查看寄存器ebp中的内容 (简写为 i r ebp)
- i r eflags 查看状态寄存器
- i r ss 查看段寄存器
- i b 查看断点信息
- i functions 查看所有的函数
- disas addr 查看addr处前后的反汇编代码
- stack 20 查看栈内20个值
- show args 查看参数
- vmmap 查看映射状况 peda带有
- readelf 查看elf文件中各个段的起始地址 peda带有
- parseheap 显示堆状况 peda带有
1.3 查找数据
- find 查找字符串 peda带有
- searchmem 查找字符串 peda带有
- ropsearch "xor eax,eax;ret" 0x08048080 0x08050000 查找某段的rop peda带有
- ropgadget 提供多个pop|ret可行结果 peda带有
1.4 修改数据
- set $esp=0x110 修改寄存器的值
- set *0xf7ff3234=0x08042334 修改内存的值
- set args "asdasg" "afdasgasg" "agasdsa" 分别给参数1,2,3赋值
- set args "
python -c 'print "1234\x7f\xde"'" 这个参数中用python脚本重写了一下,避免有些字符无法正确设置 - r "arg1" "arg2" "arg3" 设置参数
- run
$(perl -e 'print "A"x20')
1.5 peda插件
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
vmmap:查看当前程序映射的内存块
dumprop:
2. 查找某个plt、got、plt_2
- plt 可以直接使用pwntools中的ELF(elf).symbols(function_name)
- got 可以直接使用pwntools中的ELF(elf).got(function_name)
- plt_2 可以直接使用pwntools中的ELF(lib).symbols(function_name)
3. 查找程序所动态链接的库
- file pwn3
- pwn3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=916959406d0c545f6971223c8e06bff1ed9ae74d, not stripped
- checksec pwn3
- [*] '/root/Desktop/Pwnable/fmt/normal/fmt_string_write_got/pwn3'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
- [*] '/root/Desktop/Pwnable/fmt/normal/fmt_string_write_got/pwn3'
- ldd pwn3
- linux-gate.so.1 (0xf77ad000)
libc.so.6 => /lib32/libc.so.6 (0xf75d2000)
/lib/ld-linux.so.2 (0x56601000)
- linux-gate.so.1 (0xf77ad000)
4. 编译32位可执行文件
gcc -m32 test.c -o test
- 一般而言此时的目标文件为32位,且不能生成调试信息
gcc -m32 -g test.c -o test
生成的目标文件是32位,且可以利用操作系统的“原生格式(native format)”生成调试
信息。GDB 可以直接利用这个信息,其它调试器也可以使用这个调试信息
其它保护状态的开启,请参考linux程序的常用保护机制
5. 开启PIE之后的调试
开启PIE之后,地址会一直在变,这十分不利于gdb的调试,所以这时候应该在本地关闭ASLR
常用的方法是:echo 0 > /proc/sys/kernel/randomize_va_space
开启的方式是:echo 2 > /proc/sys/kernel/randomize_va_space
6. 运行时查看文件执行
做了一道题,在你不执行的时候,只能找到相对地址,但是下断点需要实际的执行地址。若关闭PIE,那么每次的执行地址将会一致,这个时候就需要找到执行的开始地址。peda的常用指令中有vmmap,可以找到实际地址。
这道题很让人苦恼的是,如果gdb中执行run,那么将陷入循环而不能使用vmmap,若强制结束,最后vmmap会报错。这个时候,就有另外的一些办法:
- 执行./pwn &,这个时候会将pwn程序放入后台,而且你能快速知道这个程序的PID,这个时候cat /proc/pwn的PID/maps,就能找到对应的执行时地址。之后kill -9 pwn的PID
- 编写一个小脚本,任意放置一个断点,并开启gdb调试,这个时候断点会崩溃,但是gdb-peda中使用vmmap仍能找到对应地址
【转】gdb的调试与使用的更多相关文章
- gdb可以调试python的pdb么
1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...
- Window平台Grmon下如何使用gdb进行调试
Window平台Grmon下如何使用gdb进行调试 1输入cmd命令,打开其窗口,进入你要执行的文件目录下 2.连接开发板,输入grmon –altjtag –u 3.连上后,输入gdb命令 4.再输 ...
- GDB代码调试与使用
GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接 ...
- gdb 多线程调试
gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/lit ...
- GDB 进行调试 使用心得
GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的. 需要像以下这样使用: #gdb app ...
- GDB+GDBServer调试Linux应用程序
参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...
- GDB 多进程调试
启动: $gdb <file> || $gdb 然后(gdb)file <file> 运行: (gdb)run <该程序本身的命令行参数> 查看代码: (gdb) ...
- DM368 arm板GDB远程调试
参考: http://www.erchashu.com/wiki/eclipse-cdt-gdb-arm-app-cross-debug 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通 ...
- gdb 远程调试android进程 -转
什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...
- Gdb远程调试Linux内核遇到的Bug
知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...
随机推荐
- bay——linux6.5-PV-LV-VG扩容.txt
[root@rac2 cdrom]# export LANG=en_US[root@rac2 cdrom]# lsblk[root@rac2 cdrom]# lvscan --- 查看系统PV LV ...
- Linux-3.14.12内存管理笔记【伙伴管理算法(2)】
前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作. 具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init(): [file:/init/main. ...
- oracle中utl_raw
RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节.LONG RAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变 ...
- 趣谈Linux操作系统学习笔记:第二十五讲
一.mmap原理 在虚拟内存空间那一节,我们知道,每一个进程都有一个列表vm_area_struct,指向虚拟地址空间的不同内存块,这个变量名字叫mmap struct mm_struct { str ...
- Python必备收藏!博士大佬总结的Pycharm 常用快捷键思维导图
搜索 Ctrl + Shift + F7用法高亮显示 Ctrl + Alt + F7显示用法 编辑 Ctrl + Shift + V从最近的缓冲区粘贴 Ctrl + D复制选定的区域或行到后面 ...
- 1+x 证书 Web 前端开发中级理论考试(试卷 7 ) 答案
1+x 证书 Web 前端开发中级理论考试(试卷 7 ) 答案 转载请注明来源:妙笔生花个人博客http://blog.zh66.club/index.php/archives/438/ 官方QQ群 ...
- IT兄弟连 Java语法教程 数据类型转换
类型转换是将一个值从一种类型更改为另一种类型的过程.例如,可以将String(字符串,字符串是Java中非常特殊的数据类型,字符串属于引用类型,但是可以像基本类型一样使用字面值赋值)类型数据“456” ...
- Bag of Tricks for Image Classification with Convolutional Neural Networks
这篇文章来自李沐大神团队,使用各种CNN tricks,将原始的resnet在imagenet上提升了四个点.记录一下,可以用到自己的网络上.如果图片显示不了,点击链接观看 baseline mode ...
- rsync免交互方法
添加-e "ssh -o StrictHostKeyChecking=no" rsync -avzP -e "ssh -o StrictHostKeyChecking=n ...
- C#函数的参数传递方式1(值传递与地址传递)
using System; namespace class1 { class program { static void Main(string[] args) { //值传递引用,实际参数不会变化 ...