gdb-pada调试实例

先编写个简单的hello的程序

hello.c  (ps:有没有头文件行不行,试试不就知道了)
 1 int main(){
 2     printf("hello!\n");
 3     int m,n;
 4     int array[5] = {1,2,3,4,5};
 5     fun1(m,n);
 6     printf("array[0] = %d\n",array[0]);
 7     printf("array[-1] = %d\n",array[-1]);
 8     printf("array[7] = %d\n",array[7]);
 9     printf("%x\n");
10     char *a,*b,*c,*d;
11     a = malloc(20);
12     a = malloc(20);
13     a = malloc(200);
14     a = malloc(0x21000);
15     free(a);
16 }
17 int fun1(int a,int b){
18     a = 1;
19     b = 2;
20     return 0;
21 }

gcc编译

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

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

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

 

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


 objdump 可以查看汇编代码

1 objdump -d hello

进入gdb

1 gdb ./hello
1 start   开始

disassemble  main    查看main函数汇编

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

1 c   运行

现在看看结果怎么来的

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

 

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

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

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

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

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

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


gdb-peda调试命令

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

猜你喜欢

转载自www.cnblogs.com/cdy-tlpt/p/10202253.html