•   站长QQ3308757747
  •   官方Q群:1057658362

Pwn:gdb基础篇

摘要:     第二篇来了,就如第一篇所说,这篇文章会介绍gdb基础的使用方法,因为昨天服务器被ddos了,今天才修好,先对更新慢道一句抱歉,那么废话不多说,直接开始介绍我们今天的主角——gdb。    gd...

    第二篇来了,就如第一篇所说,这篇文章会介绍gdb基础的使用方法,因为昨天服务器被ddos了,今天才修好,先对更新慢道一句抱歉,那么废话不多说,直接开始介绍我们今天的主角——gdb。

    gdb是一个很强大的动态调试工具,在命令行里操作,也许不如VC那样的IDE图形调试界面那么好上手,但是这款工具熟练之后非常强大,在pwn中也发挥着很重要的作用,一般来说,gdb能完成以下的四个功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。(例如检查此时各寄存器的值)

4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

断点:是指程序运行到某个地方或者达到某个条件就暂停运行的一个标记

IDE:是指图形操作界面

VC:一个拥有IDE的动态调试程序

寄存器:就是系统储存各种值的部件,关于寄存器以及汇编,将会在下一篇文章详细介绍

(这里可能有点繁琐,因为作者想让更多的人能够理解,所以希望大佬们原谅我写的这么繁琐)

接下来上我们本次要进行演示的程序源码:

#include <stdio.h>
void debug(char *str)
{
    printf("debug info :%s\n",str );
}
main(int argc,char *argv[])
{    int i,j;
    j=0;   
     for(i=0;i<10;i++){
        j+=5;
        printf("now a=%d\n", j);
    }
}

这个程序十分简单,就是简单的写了一个输出的函数,主函数里也就简单写了个循环,接下来让我们开始使用gdb分析这个程序

gdb test(或者gdb之后file test)

注意,编译时要加上-g参数,否则就会出现错误

gcc test.c -g -o test
gdb test

6TRQCRJLLY4}@)7~OP_}NYU.png

                                                       成功启动

gdb基本使用操作

显示源码函数list(简写为l)

list n 列出以n为中心的十行源代码(默认为从第一行开始,一次显示十行代码)

L6B[EFXXNB@WC)IQ1%CN@XK.png

list 函数名是显示以该函数为中心的十行代码

8%F7$4Y8AZNPT7_)J6RG3[J.png

list - 显示刚刚显示源代码之前的源代码

$V{R0J@B]WSGII4B9~S`BZ8.png

断点函数break(简写b)

break 地址或函数名或数字 在地址或函数处或第几行设置断点,程序运行到断点时会暂停运行方便分析

]{A459}DMQ6)G]SY6SYR5GR.png

run运行(简写为r)

C8Y)K]@H65ZC4YXWCS@)2V5.png

程序成功在13行断住

continue(简写为c):继续运行

4``5)AZ4Z1GY`EQKAXKWJGG.png

因为这里是写了一个for循环,所以13行会被反复执行,也会被反复断住

注意:continue是继续运行直到下一个断点,如果使用run则会提示是否从程序开头开始运行

9E}J7IWY(GET_MZ1RMG$]~8.png

delete 断点编号:删除断点

XD9KBKT]A4{R$BW62F5WB0K.png

成功删除,程序不会再次被截断

断点编号即breakpoints后面的数字

display命令(查看参数的值)

首先我们设置断点并运行

UQD_%QWZU8~6(94KQEDPB[0.png

成功在第十行断住,display命令查看

@JNSB`~AWUM`7(5R655ST`G.png

接下来继续运行

R5RP28T5RPKI0PHM7M}%NOC.png

可以看到程序追踪这两个值,直接输入delete删除所有断点

KZRD]NVI80ONY8W`)$IMX~U.png

程序正常退出

step以及next命令

step和next是指让程序逐行运行,方便查看变量的值变化是否符合要求

同样是先设置断点并运行

NWV4`W7F]9X{R%UCY1FYO4U.png

这里可以看到上次display的参数还在运行,使用delete display删掉并重新运行

IR83Q{V1M7)](9YRR4JSA37.png

这里成功断住了,接下来单步执行

$)IUS`G~02FFQ]@(Z~QR~8S.png

这里说下如何查看各寄存器的值,info registers

Y[A9%TE1K(DW6G$31DKXMCF.png

关于寄存器的详细信息,将会在下一篇文章介绍

为了使效果明显,我们查看j的值

[TE31URFGR7$5(}`CQ7HFKG.png

可以看到j的值发生变化,next作用相同

AJ0%TP7L}S[N@OV]176F8@X.png

step n或者next n表示连续执行接下来几行代码

M@@`I5P8LXG]IK$ABXRC$KD.png(step缩写为s)

watch命令

watch命令用于设置观察点,当被观察的表达式或变量的值变化时程序停止运行

还是先设置断点并运行

LAF$FHA@F4EF3G(96Y4BQ(Y.png

接下来设置观察点j并删除断点1,运行程序

6HD2W3M(Y%0%QIBG%(SFE`S.png

这里可以看到当j的值变化时程序自动暂停并且观察点自动销毁

KQS(_T43U`_9AUH~@E}EMYL.png

继续运行程序,正常退出

好了,这篇gdb基础文章就到这里,如果有什么不足还请大家指出,下一篇我将会写关于寄存器也就是汇编基础,让大家理解更透彻,谢谢你的观看和支持

本文链接:http://www.my-index.cn/?id=21

版权声明:转载请注明转自“my-index.cn”

分享到:

发表评论

评论列表

还没有评论,快来说点什么吧~

歌曲 - 歌手
0:00