Hacker基础之Linux篇:进阶Linux命令二

小姐姐最大

今天我们进入Linux进阶的第二颗

Linux C程序的调试

这里我们会解释一下怎样在Linux下调试C程序

可能有的同学会问,这和Hacker有什么关系呢?

因为吧,简单说,这其实就是LinuxPWN技术的基础

PWN>是一个黑客语法的俚语词,是指攻破设备或者系统

发音类似,对黑客而言,这就是成功实施黑客攻击的声音,砰的一声,被的电脑或手机就被你操纵了

以上抄自某度

通过二进制/系统调用等方式获得目标主机的shell

Windows上的PWN,当然也有Linux上的PWN,但是相比较Windows丰富的调试工具,Linux上就显得"寒酸"多了(我是打双引号的啊,大家别打我~~~)

Windows上有大家熟悉的OD啊,IDA啊等等,大家都很熟悉了,现在我们就介绍一下Linux上的调试工具

gdb

这个神器gdb的全称是(GNU Debugger),是一个可移植的调试器,可运行在许多类Unix系统上,可用于许多编程语言,包括AdaCC++Objective-CFree PascalFortranGoJava

他的作者Richard StallmanGNU的提出者和创建者,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函数设置一个断点(bbreak的缩写)

这里就会在第六行也就是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程序可用于列举符号和其类型和值,但是,要更仔细的研究目标文件中这些命名段的内容,我们需要使用更强大的工具,我们下一节介绍

本文完

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180525G1CX8A00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券