小姐姐最大
今天我们进入Linux进阶的第二颗
Linux C程序的调试
这里我们会解释一下怎样在Linux下调试C程序
可能有的同学会问,这和Hacker有什么关系呢?
因为吧,简单说,这其实就是LinuxPWN技术的基础
PWN>是一个黑客语法的俚语词,是指攻破设备或者系统
发音类似,对黑客而言,这就是成功实施黑客攻击的声音,砰的一声,被的电脑或手机就被你操纵了
以上抄自某度
通过二进制/系统调用等方式获得目标主机的shell
有Windows上的PWN,当然也有Linux上的PWN,但是相比较Windows丰富的调试工具,Linux上就显得"寒酸"多了(我是打双引号的啊,大家别打我~~~)
Windows上有大家熟悉的OD啊,IDA啊等等,大家都很熟悉了,现在我们就介绍一下Linux上的调试工具
gdb
这个神器gdb的全称是(GNU Debugger),是一个可移植的调试器,可运行在许多类Unix系统上,可用于许多编程语言,包括Ada,C,C++,Objective-C,Free Pascal,Fortran,Go,Java
他的作者Richard Stallman,GNU的提出者和创建者,Linux是属于GNU的一个项目
反正很牛x就对了
如何使用gdb呢
首先我们要在编译的时候加入-g选项,才能很好的使用gdb,当然,不加也是可以使用的
这里我用一个C程序来演示使用gdb
这里先列出gdb的一些基本命令
break - b #设置断点
run - r #运行程序
next - n #单步调试
print var1 #查看变量的值
list - l #显示源码
info b #显示断点设置情况
ok,我们开始,假设我在本地有个1.c的程序
我们先编译它
gcc 11.c -o 11 -g -Wall
这里稍微解释一下
-o是将创建的可执行文件命令为11的意思
-g是我们要求编译的时候加入调试信息
-Wall是显示所有的错误和提醒
这对于Linux C程序猿很熟悉了我就不班门弄斧了
编译的结果是这样的,这里有个warning是因为我返回了一个局部变量
一般要在调用程序里面要专门申请一个空间传入被调用函数中
然后将返回值写入这个空间中才是比较稳妥的写法
因为这里是我N年前写的代码了,我们就不管这个warning了
之后我们用gdb打开这个可执行文件11
我们可以试试我们上面的命令,比如显示源码
或者在main函数设置一个断点(b是break的缩写)
这里就会在第六行也就是mian函数的下一行有了一个断点
更多的gdb的知识,大家可以google或者bing
pstack
pstack是个脚本工具,可显示每个进程的栈跟踪
他的功能在gdb中也有相应的实现
我们演示一下基本的使用(我们要预先用ps知道目标进程的PID)
pstack 19703
starce
strace常用来跟踪进程执行时的系统调用和所介绍到的信号
在Linux中,进程不能直接访问硬件设备,当进程需要访问硬件设备时(读取磁盘文件,接受网络数据等等),必须由用户态模式切换到内核态模式
然后通过系统调用访问硬件设备
strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗时间等等
strace -o out.txt -T -tt -e trace=all -p 19703
上面程序的意思是跟踪进程19703的所有的系统调用,并统计系统调用时间,以及开始时间,最后将结果记录在out.txt中
执行一段时间之后我们可以打开out.txt查看
或者我们可以查看实时输出
strace -p 19703
nm
nm命令是用来列出目标文件的符号清单
拿我们刚刚的11可执行文件演示
我们看到的就是一个程序的结构
nm程序可用于列举符号和其类型和值,但是,要更仔细的研究目标文件中这些命名段的内容,我们需要使用更强大的工具,我们下一节介绍
本文完
领取专属 10元无门槛券
私享最新 技术干货