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成员偏移