Java教程

GDB调试结果和直接运行结果不一致

本文主要是介绍GDB调试结果和直接运行结果不一致,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

解决了一个在SEEDLAB实验中写exploit时遇到的问题
本文地址 https://www.cnblogs.com/LovLetter/p/15073373.html
转载请注明出处

0X00 问题描述

我的任务是构造一个badfile,利用有漏洞的程序获得一个root shell

我利用GDB来查看堆栈和寄存器情况,随着单步执行,我在GDB调试的状态下得到了一个普通shell,但是如果我直接运行程序,我却只能得到一个Segmentation fault。

0X01 问题分析

先给出分析结果:GDB调用和直接调用的地址分布可能不同
同一个程序被以不同的方式被调用,地址是有可能不同的,使用绝对路径调用还是相对路径调用也会有所不同。

如果想通过漏洞来获得root shell,我们要确保badfile被精确地构造。如果在GDB下可以获得一个普通shell,说明badfile的构造符合被GDB调用的这个程序,但是可能不符合你直接调用的这个程序。

你可以用一个简单的方法检测一下如何调用程序能让它的地址分布与被GDB调用的地址分布相同。修改程序的源代码,让程序打印某个变量的地址,如果两个调用方式所打印的地址是相同,那它们可能就有相同的地址分布了。

0X02 我的解决方案

参考了StackOverflow的一个解答,我使用绝对路径调用程序便可以得到root shell了。

0X03 补充说明

Segmentation fault代表着什么?
Segmentation fault往往意味着识图访问无法访问的内存,比如把EIP的值置为无法访问的地址。

为什么我在GDB上只得到一个普通shell,但是运行时却可以得到root shell?
当你用GDB调试一个setuid root程序,会遇到这个问题,你可以在这里得到更多信息。

0X04 References:

1.My exploit only works under gdb?
2.Segmentation fault
3.Buffer overflow works in gdb but not without it
4.Can gdb debug suid root programs?

这篇关于GDB调试结果和直接运行结果不一致的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!