先编写个简单的hello的程序

hello.c  (ps:有没有头文件行不行,试试不就知道了)
 int main(){
printf("hello!\n");
int m,n;
int array[] = {,,,,};
fun1(m,n);
printf("array[0] = %d\n",array[0]);
printf("array[-1] = %d\n",array[-1]);
printf("array[7] = %d\n",array[7]);
printf("%x\n");
char *a,*b,*c,*d;
a = malloc();
a = malloc();
a = malloc();
a = malloc(0x21000);
free(a);
}
int fun1(int a,int b){
a = ;
b = ;
return ;
}

gcc编译

虽然报了一些警告,但是不影响我们的输入     -m32 生成32位的

 给a.out文件执行权限,运行一下程序

gcc编译 加一些别的参数可以看到编译过程的文件

编译过程: c     预编译    汇编   elf(可重定位文件)    .out 文件


objdump 可以查看汇编代码

 objdump -d hello

进入gdb

 gdb ./hello
 start   开始

disassemble  main    查看main函数汇编

 info functions  查看程序的所有函数
 l   查看代码

 c   运行

现在看看结果怎么来的

l   查看代码
tb      设置一次性断点
run   运行

 可以看到程序运行到第四行,准备执行数据入栈,我们先查看一下 ebp-0x20有什么数据
x/10dw ebp-0x20

数据是看不懂的,继续设置断点运行程序

可以看到运行到了第6行,准备取array[]的数据,地址是ebp-0x20,再看看数据

发现就是入栈的数据
0xffffd068:
0xffffd078: - -12128
继续执行程序,设置断点
tb 7
c

 mov    eax, dword ptr [ebp - 0x24]    取出数值然后赋值给eax
查看 ebp - 0x24
x/10dw $ebp-0x24

依次所见  array[] = -
最后执行完程序看看结果
c


gdb-peda调试命令

 break *0x400100 (b main):在 0x400100 处下断点
tb一次性断点
info b:查看断点信息
delete [number]:删除断点
watch *(int *)0x08044530:在内存0x0804453处的数据改变时stop
x /4xg $ebp:查看ebp开始的4个8字节内容(b:单字节,h:双字节,w:四字节,g:八字节;x:十六进制,s:字符串输出,i:反汇编,c:单字符)
p $eax:输出eax的内容
set $eax=:修改变量值
c:继续运行
r:重新开始运行
ni:单步步过
si:单步步入
fini:运行至函数刚结束处
return expression:将函数返回值指定为expression
bt:查看当前栈帧
info f:查看当前栈帧
context:查看运行上下文
stack:查看当前堆栈
call func:强制函数调用
ropgagdet:找common rop
vmmap:查看虚拟地址分布
shellcode:搜索,生成shellcode
ptype struct link_map:查看link_map定义
p &((struct link_map*))->l_info:查看l_info成员偏移

gdb-pada调试实例的更多相关文章

  1. Linux多进程和多线程的一次gdb调试实例

    转载https://typecodes.com/cseries/multilprocessthreadgdb.html 1 原文整理 默认设置下,在调试多进程程序时gdb只会调试主进程.gdb7以上的 ...

  2. 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

    基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...

  3. gdb各种调试命令和技巧

    陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...

  4. gdb可以调试python的pdb么

    1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...

  5. Window平台Grmon下如何使用gdb进行调试

    Window平台Grmon下如何使用gdb进行调试 1输入cmd命令,打开其窗口,进入你要执行的文件目录下 2.连接开发板,输入grmon –altjtag –u 3.连上后,输入gdb命令 4.再输 ...

  6. GDB代码调试与使用

    GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接 ...

  7. gdb 多线程调试

    gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html  http://hi.baidu.com/lit ...

  8. GDB 进行调试 使用心得

    GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法:   直接用 gdb app -p1 -p2 这样进行调试是不行的.   需要像以下这样使用:    #gdb app   ...

  9. GDB+GDBServer调试Linux应用程序

    参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...

  10. GDB 多进程调试

    启动: $gdb <file>  || $gdb 然后(gdb)file <file> 运行: (gdb)run <该程序本身的命令行参数> 查看代码: (gdb) ...

随机推荐

  1. c++ 面试整理

    1. 继承方式 public    父类的访问级别不变 protected    父类的public成员在派生类编程protected,其余的不变 private        父类的所有成员变成pr ...

  2. eclipse编码转换

    一般Java文件编码格式是UTF-8的.以下以默认GBK改为UTF-8为例. 1.改变整个工作空间的编码格式,这样以后新建的文件也是新设置的编码格式.     eclipse->window-& ...

  3. spring笔记2-注解

    一.属性与成员变量的区别: 属性:对外暴露的,getxxx/setxxx称为属性; 成员变量:private String name称为成员变量或字段 二.applicationContext.xml ...

  4. iOS - The identity used to sign the executable is no longer valid

    ①.首先在xcode中的Build Settings中看有没有设置: ②.账号是不是多个人在用,个人开发者的账号只能绑定一台电脑,当另外一台电脑绑定了话,你的电脑就失效了.你确认下是不是这个原因造成的 ...

  5. ASP.NET MVC 音乐商店 - 1 创建项目

    我们的项目从在 Visual Studio 中的文件菜单中选择“新建”,选择“项目”开始. 然后,选择 C# 中的 Web 模板组,在右边的项目模板中选择 ASP.NET MVC3 Web 应用程序, ...

  6. 《spring技术内幕》读书笔记(1)——什么是POJO模式

    今天在看<spring技术内幕>,第一章中多次提到了使用POJO来完成开发,就百度了一下,在此保留 1.     什么是POJO POJO的名称有多种,pure old java obje ...

  7. ssh代理登录内网服务器

    服务器 192.168.48.81 # client 192.168.48.82 # bastion 192.168.48.83 # private password方式 192.168.48.81 ...

  8. [转]Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

    今天学习了Spinner组件,使用Spinner相当于从下拉列表中选择项目,下面演示一下Spinner的使用(分别使用ArrayAdapter和自定义Adapter实现) (一):使用ArrayAda ...

  9. 【转】run方法与start方法的区别

    在java线程中 start与run的不同start与run方法的主要区别在于当程序调用start方法一个新线程将会被创建,并且在run方法中的代码将会在新线程上运行,然而在你直接调用run方法的时候 ...

  10. 笨办法学Python(二十三)

    习题 23: 读代码 上一周你应该已经牢记了你的符号列表.现在你需要将这些运用起来,再花一周的时间,在网上阅读代码.这个任务初看会觉得很艰巨.我将直接把你丢到深水区呆几天,让你竭尽全力去读懂实实在在的 ...