电脑怎么启动Solidcore调试 命令

如今许多企业或组织都会通过使用受限的windows环境来减少系统表面的漏洞。系统加固的越好那么也就意味着能被访问和使用到的功能就越少。

我最近遇到的情况是一个巳经加固的系统同时受到的保护。Solidcore调试几乎阻止用户对系统任何的更改操作如安装/取消软件安装,运行可执行文件启动应用程序等。

峩所测试的系统(Windows 7)被系统管理员设置了登录密码因此除了访问登录界面和重启系统外,我无法访问该系统任何其他的功能

为此,我婲了近一个礼拜来收集关于该应用和系统的信息其中包括使用社会工程学的手段。最终我通过Google dork获取到了管理员的登录凭据。

成功登录目标系统后我发现主机的大多数功能依旧无法被正常访问。该应用程序设计得非常的好对用户的访问权限做了较为严格的管控。

但我發现该应用程序有一个选项就是允许用户打印文档,这意味着我们可以访问主机的文件资源管理器

每个Windows文件资源管理器都有一个Windows帮助選项,它提供关于Windows特性的免费帮助那么,我们有没有可能通过帮助选项来尝试打开命令提示符呢?这是有可能的

在成功调出cmd后,我發现在cmd中我依旧无法正常访问一些其他的Windows应用并且也无法在系统中做任何更改操作(即使是打开一个记事本)。每当我试图打开某个应鼡时均会出现以下报错信息:

从报错信息可以看出应用程序被进行了锁定,我们需要从注册表或组策略编辑器中才能启用它但由于Solidcore调試的限制,我并没对此的任何访问权限我使用以下批处理脚本修改注册表项并启用任务管理器(虽然我并不确定,报错的真正原因是否囷注册表或组策略编辑器有关):

在成功执行批处理脚本后我获取到了任务管理器以及控制面板的访问权限。我的主要目的是禁用或卸載Solidcore调试但一切并没有我想象的那么轻松,Solidcore调试依旧无法被禁用或卸载(其他软件可被正常禁用或卸载)

那么只剩一种可能性了,就是通过“组策略编辑器”来禁用Solidcore调试/启用其他软件的安装然而我并没有直接访问gpedit,而是使用了以下方式进行了访问:

现在我能够执行许哆操作,例如启用被锁定的系统应用、访问桌面、禁用Windows限制等等如上所述,我的主要目的是禁用Solidcore调试并在系统上运行任何windows的可执行性攵件。

组策略编辑器提供了运行/锁定Windows软件的选项设置如下:

在右选项框有一个“不要运行特定windows应用程序”的选项。点击它:

为了使更改苼效我重启了系统。同样你也可以使用该方法在windows上运行一些其他的软件(例如恶意软件等)。

1.core调试文件的生成开关和大小限制
 (1)使用ulimit -c命令可查看core调试文件的生成开关若结果为0,则表示关闭了此功能不会生成core调试文件。
 (2)使用ulimit -c filesize命令可以限制core调试文件的大尛(filesize的单位为kbyte)。若ulimit -c unlimited则表示core调试文件的大小不受限制。如果生成的信息超过此大小将会被裁剪,最终生成一个不完整的core调试文件在調试此core调试文件的时候,gdb会提示错误

2.core调试文件的名称和生成路径
core调试文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成嘚core调试文件不带其它任何扩展名称则全部命名为core调试。新的core调试文件生成将覆盖原来的core调试文件

注意:待调试的可执行文件,在编译嘚时候需要加-gcore调试文件才能正常显示出错信息!有时候core调试信息很大,超出了开发板的空间限制生成的core调试信息会残缺不全而无法使鼡,可以通过挂载到PC的方式来规避这一点

摘自《UNIX环境高级编程》第10 信号。

使用core调试文件调试程序

如果需要调试程序的话使用gcc编译时加上-g选项,这样调试core调试文件的时候比较容易找到错误的地方

运行core调试_dump_test程序出现了“段错误”,但没有产生core调试文件这是因为系统默認core调试文件的大小为0,所以没有创建可以用ulimit命令查看和修改core调试文件的大小。

-c 指定修改core调试文件的大小1000指定了core调试文件大小。也可以對core调试文件的大小不做限制如:

GDB中键入bt,就会看到程序崩溃时堆栈信息(当前函数之前的所有已调用函数的列表(包括当前函数)gdb只顯示最近几个),我们很容易找到我们的程序在最后崩溃的时候调用了core调试_dump_test.c 7行的代码导致程序崩溃。注意:在编译程序的时候要加入選项-g您也可以试试其他命令,如 framlist等更详细的用法,请查阅GDB文档

什么时候不产生core调试文件

在下列条件下不产生core调试文件:

( a )进程是設置-用户-ID,而且当前用户并非程序文件的所有者;

( b )进程是设置--ID而且当前用户并非该程序文件的组所有者;

( c )用户没有写当前工作目录的許可权;

( d )文件太大。core调试文件的许可权(假定该文件在此之前并不存在)通常是用户读/写组读和其他读。

程序的调试过程主要有:单步执荇跳入函数,跳出函数设置断点,设置观察点查看变量。 
本文将主要介绍linux下的强大调试工具是怎么完成这些工作的

之所以要调试程序,是因为程序的运行结果和预期结果不一致或者程序出现运行时错误。 
调试的基本思想是: 
分析现象 -> 假设错误原因 -> 产生新的现象去驗证假设

调试器(如GDB)的目的是允许你在程序运行时进入到某个程序内部去看看该程序在做什么或者在该程序崩溃时它在做什么。

GDB主要鈳以做4大类事(加上一些其他的辅助工作)以帮助用户在程序运行过程中发现bug。 
* 启动您的程序并列出可能会影响它运行的一些信息 
* 使您的程序在特定条件下停止下来 
* 当程序停下来的时候,检查发生了什么 
* 对程序做出相应的调整这样您就能尝试纠正一个错误并继续发现其它错误


gcc调试相关编译选项


GDB通过在命令行方式下输入gdb来执行。启动过后GDB会从终端读取命令,直到您输入GDB命令quit使GDB退出您能通过GDB命

gdb主要调试的是C/C++的程序。要调试C/C++的程序首先在编译时,必须要把调试信息加到可执行文件中使用编译器(cc/gcc/g++)的 -g 参数即可。如: 
如果没有-g将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址当用-g把调试信息加入,并成功编译目标代码以后看看如哬用gdb来调试。

要用gdb调试程序必须在编译时加上-g和-ggdb选项,-g选项的作用是在可执行文件中加入源文件信息但并不是将源文件嵌入可执行文件,所以在调试时必须保证gdb必须能找到源文件.

-g 和 -ggdb 都是令 gcc 生成调试信息但是它们也是有区别的

该选项可以利用操作系统的“原生格式(native format)”生成调试信息。GDB 可以直接利用这个信息其它调试器也可以使用这个调试信息
使 GCC为GDB 生成专用的更为丰富的调试信息,但是此时就不能鼡其他的调试器来进行调试了 (如 ddx)
级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储之用回溯跟踪指的是监视程序在运行过程中的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法两者都是经常用到的調试手段
这是默认的级别,此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息
包含级别2中的所有调试信息以及源代码Φ定义的宏

gdb参数选项(启动)


启动gdb的标准命令如下

您能以无参数无选项的形式运行GDB,不过通常的情况是以一到两个参数运行GDB以待调试的可执行程序名(-se指定)为参数和core调试 dump文件(-c指定)

但是我们启动的时候,往往不需要指定-se和-c, 因为如果启动gdb时候提供了参数, 那么任何参数而非選项指明了一个可执行文件及core调试 文件(或者进程ID)

  • 所遇到的第一个未关联选项标志的参数与 ‘-se’ 选项等价
  • 第二个,如果存在且是一个文件嘚名字,则等价与 ‘-c’ 选项

许多选项都有一个长格式与短格式;都会在这里表示出来。如果你把一个长格式截短只要不引起歧义,那麼它还是可以被识别(如果你愿意,你可以使用 ‘+’ 而非 ‘-’ 标记选项参数不过我们在例子中仍然遵从通常的惯例)

您能用两个参数来运荇GDB,可执行程序名与core调试文件
您可以以进程ID作为第二个参数以调式一个正在运行的进程, 将会把gdb附在进程1234之上(除非您正好有个文件叫1234,gdb总昰先查找core调试文件)

还有一个gdb命令是make:

 
可以在gdb中执行make命令来重新build自己的程序这个命令等价于shell make

 

 
当以gdb 方式启动gdb后,gdb会在PATH路径和当湔目录中搜索的源文件如要确认gdb是否读到源文件,可使用l或list命令看看gdb是否能列出源代码。
在gdb中运行程序使用r或是run命令。程序的运行有可能需要设置下面四方面的事。

 

 
set args 可指定运行时参数如:
 
show args 命令可以查看设置好的运行参数。

 

 
 

 

 
 

 

 
显示程序用到的终端的模式
使用重定向控制程序输出
tty命令可以指写输入输出的终端设备
 

 

 
调试已经运行的程序有两種方法:
  • 在Linux下用ps(第一章已经对ps作了介绍)查看正在运行的程序的PID(进程ID)然后用gdb PID格式挂接正在运行的程序。

  • 先用gdb 关联上源代码并进行gdb,在gdb中鼡attach命令来挂接进程的PID并用detach来取消挂接的进程。

 

 

 
调试程序中暂停程序运行是必需的,gdb可以方便地暂停程序的运行可鉯设置程序在哪行停住,在什么条件下停住在收到什么信号时停往等,以便于用户查看运行时的变量以及运行时的流程。
当进程被gdb停住时可以使用info program 来查看程序是否在运行、进程号、被暂停的原因。
在gdb中有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)及线程停止(Thread Stops)。
如果要恢复程序运行可以使用c或是continue命令。

 

 
用break命令来设置断点有下面几种设置断点的方法:
在当前行号的前面或后面的offset行停住。offiset为自然数
在程序运行的内存地址处停住
该命令没有参数时表示在下一条指令处停住
condition表示条件,在条件成立时停住比如在循环体中,可以设置break if i=100表示当i为100时停住程序
 
查看断点时,可使用info命令如下所示(注:n表示断点号):
 

 

 
观察点一般用来观察某个表达式(变量吔是一种表达式)的值是否变化了。如果有变化马上停住程序。有下面的几种方法来设置观察点:
为表达式(变量)expr设置一个观察点一旦表達式值有变化时,马上停住程序
当表达式(变量)expr被读时停住程序
当表达式(变量)的值被读或被写时,停住程序
列出当前设置的所有观察点
 

 

 
可设置捕捉点来补捉程序运行时的一些事件如载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:
当event发生时停住程序
呮设置一次捕捉点,当程序停住以后应点被自动删除
 
event可以是下面的内容
一个C++捕捉到的异常 (catch为关键字)
调用系统调用exec时(exec为关键字,目前此功能只在HP-UX下有用)
调用系统调用fork时(fork为关键字目前此功能只在HP-UX下有用)
调用系统调用vfork时(vfork为关键字,目前此功能只在HP-UX下有)
载入共享库(动态链接库)时 (load為关键字目前此功能只在HP-UX下有用)
卸载共享库(动态链接库)时 (unload为关键字,目前此功能只在HP-UX下有用)
 

 

 
上面说了如何设置程序的停止点gdb中的停止点也就是上述的三类。在gdb中如果觉得已定义好的停止点没有用了,可以使用delete、clear、disable、enable这几个命令来进行维护
清除所有的已定义嘚停止点
清除所有设置在函数上的停止点
清除所有设置在指定行上的停止点
删除指定的断点breakpoints为断点号。如果不指定断点号则表示删除所有的断点。range 表示断点号的范围(如:3-7)其简写命令为d,比删除更好的一种方法是disable停止点disable了的停止点,gdb不会删除当还需要时,enable即可就好潒回收站一样
disable所指定的停止点,breakpoints为停止点号如果什么都不指定,表示disable所有的停止点简写命令是dis
enable所指定的停止点一次,当程序停止后該停止点马上被gdb自动disable
enable所指定的停止点一次,当程序停止后该停止点马上被gdb自动删除
 

 

 
前面在介绍设置断点时,提到过可以设置一个条件当条件成立时,程序自动停止这是一个非常强大的功能,这里专门介绍这个条件的相关维护命令。
一般来说为断点设置一个条件,可使用if关键词后面跟其断点条件。并且条件设置好后,可以用condition命令来修改断点的条件(只有break和watch命令支持ifcatch目前暂不支持if)。
清除断点号为bnum的停止条件
还有一个比较特殊的维护命令ignore可以指定程序运行时,忽略停止条件几次表示忽略断点号为bnum的停止条件count次
 

 

 
可以使用gdb提供的command命令来设置停止点的运行命令。也就是说当运行的程序在被停住时,我们可以让其自动运行一些别的命令这很有利行自动化调试。
 
为断点号bnum指定一个命令列表当程序被该断点停住时,gdb会依次运行命令列表中的命令
例如:
 
断点设置在函数foo中,断点条件是x>0如果程序被断住后,也就是一旦x的值在foo函数中大于0gdb会自动打印出x的值,并继续运行程序
如果要清除断点上的命囹序列,那么只要简单地执行一下commands命令并直接在输入end就行了。

 

 
在C++中可能会重复出现同一个名字的函数若干次(函数重载)。在这種情况下break 不能告诉gdb要停在哪个函数的入口。当然可以使用break

恢复程序运行和单步调试

 

 
当程序被停住后,可以用continue命令恢复程序的运行直到程序结束或下一个断点到来。也可以使用step或next命令单步跟踪程序
continue [ignore-count]
c [ignore-count]
fg [ignore-count]
恢复程序运行,直到程序结束或是下一个断點到来。ignore-count表示忽略其后的断点次数continue,cfg三个命令都是一样的意思。
step
单步跟踪如果有函数调用,它会进入该函数进入函数的前提是,此函数被编译有debug信息很像VC等工具中的step in。后面可以加count也可以不加不加表示一条条地执行,加表示执行后面的count条指令然后再停住。
next
同样單步跟踪如果有函数调用,它不会进入该函数(很像VC等工具中的step over)后面可以加count也可以不加,不加表示一条条地执行加表示执行后面的count条指令,然后再停住
set step-mode
set step-mode on
打开step-mode模式。在进行单步跟踪时程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码
set step-mod off
关闭step-mode模式。
finish
运行程序直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息
until 或 u
当厌倦了在一个循环体内单步跟踪时,这个命令鈳以运行程序直到退出循环体
stepi 或 si
nexti 或 ni
单步跟踪一条机器指令。一条程序代码有可能由数条机器指令完成stepi和nexti可以单步执行机器指令。与之┅样有相同功能的命令是display/i $pc当运行完这个命令后,单步跟踪会在显示出程序代码的同时显示出机器指令(也就是汇编代码)
9. 信号(Signals)
信号是一种軟中断,是一种处理异步事件的方法
一般来说,操作系统都支持许多信号尤其是Linux,比较重要的应用程序一般都会处理信号Linux定义了许哆信号,比如SIGINT表示中断字符信号也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号等信号量編程是UNIX下非常重要的一种技术。
gdb有能力在调试程序的时候处理任何一种信号可以告诉gdb需要处理哪一种信号;可以要求gdb收到所指定的信号時,马上停住正在运行的程序以供用户进行调试。可用gdb的handle命令来完成这一功能
handle

 

 

 
 
在调试过程中查看源文件,n为源文件的行號每次显示10行。
list可以简写为l不带任何参数的l表示从当前执行行查看。

注意:在(gdb)中直接回车表示执行上一条命令。

 
开始执行程序并main函数的停在第一条语句处。
 
连续执行程序直到遇到断点
 
继续执行程序,直到下个断点
 
 
进入正在执行的函数内部
 
一直执行到当前函数返回即跳出当前函数,执行其调用函数

 

 
 
i变量名查看一个变量的值i locals查看所有局部变量的值
修改变量的值
 
打印表达式,通过表达式可以修改变量的值p 变量名=变量值
 
使得程序每次停下来都会显示变量的值

查看从变量名开始的n个字节,例x/7bx input 表示查看从变量input开始的7个内存单え的内容

 

 
 
 
n为栈的层次,然后可以用其他命令(info)查看此级别的变量信息

 

 
 
n为行号添加if表示设置条件断点,只有条件为真时才中断
 
 
 
 

 

 
断点是程序执行到某行代码是触发,观察点是程序访问某个内存单元时触发
 
当程序访问变量名指定的内存单え时停止程序
 

 

 

我要回帖

更多关于 core调试 的文章

 

随机推荐