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了。

如果上述解答不能解决的问题,你可以参考这篇文章,文章比较详细的分析了其中的问题,而且给出了一个脚本帮你解决运行地址不一致的问题。但是不知道为什么,文章中提供的脚本在我的Ubuntu 20.04上已经无法正确运行了。

0X03 补充说明

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

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

0X04 References:

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

posted @ 2021-07-29 03:49  So_we_beat_on  阅读(865)  评论(0编辑  收藏  举报