- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设这段代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
char fonction[50] = "/usr/bin/passwd ";
char messageAccueil[100] = "changement du mot de passe de : ";
if(argc == 1){
printf("vous devez passer un username en parametre \n");
return 1;
}
printf(messageAccueil);
printf(argv[1]); //<-- format string vulnerability here !!
if(strcmp(argv[1], "root")==0){
printf("vous ne pensiez quand meme pas pouvoir changer le mot de passe de root si facilement ?\n");
return 1;
}
printf("\n");
strncat(fonction,argv[1],38);
system(fonction);
return 0;
}
我想利用格式化字符串漏洞来执行shell,因此,我想通过存储在环境变量中的 shellcode 地址重写来自 GOT 的 strcmp
函数地址。
gdb
给了我:
(gdb) info functions
0x0000000000400570 strcmp@plt
(gdb) disas 0x400570
Dump of assembler code for function strcmp@plt:
0x0000000000400570 <+0>: jmp QWORD PTR [rip+0x20070a]#0x600c80 <strcmp@got.plt>
0x0000000000400576 <+6>: push 0x6
0x000000000040057b <+11>: jmp 0x400500
End of assembler dump.
所以我想把我的shellcode地址写到0x00600c80
我如何将 nullbyte 传递到我的 ./changepasswd
文件?
我实际上正在尝试这个漏洞:
/changepasswd $(echo -e '\x80\x0c\x60\x00____\x84\x0c\x60\x00')%65527d%136\$x%59017d%137\$x
这给我地址 600c845f
但是 \x00
没有影响,没有存储到堆栈中。
我发现地址以 00 开头的事实可能是 ascii 装甲问题,但我的系统中完全没有 exec-shield 选项。
所以我正在寻找一种方法将 00 写入我的堆栈 或让我的 GOT 地址以 00 之外的其他内容开始...
最佳答案
这里有两个问题。或者,更好地说,两种不可能。
首先,有一个 shell 问题:如何将包含 NUL 的字符串作为命令行参数传递给实用程序。
Shell 变量不能包含NUL
s,因此无法构造参数字符串并将其作为参数传递。 [注意 1] 但是,您可以构造一个包含 NUL
的流并将其通过管道传输到 stdin
一些效用。剩下的只是找到一个实用程序,将其输入转换为其他实用程序的命令行参数;那将是 xargs
.因此,您可以尝试以下操作:
printf '\0This is an argument' | xargs -I{} ./victim {}
但是,由于第二个问题:xargs
,这不会起作用(大多数 argv
的实现甚至不允许您尝试 [注 2])参数 main
是 NUL
的数组-terminated 字符串,因此每个命令行参数都由第一个 NUL
终止.因此,即使您设法找到一种方法将所有字节传递到 argv
数组,该实用程序将处理 NUL
作为结束争论,而不是作为争论的一部分。 (例如,printf(argv[1])
将打印第一个参数中的字节,直到它到达 NUL
;NUL
表示格式字符串结束。)
但是你找不到办法做到这一点,因为 exec*
系统库函数(其中一个是将参数传递给另一个可执行文件所必需的)也将处理 NUL
作为终止相应的论点。自 exec*
函数需要将参数复制到新的可执行镜像的地址空间中,当到达参数末尾时,复制将终止,即NUL
之后的任何字节。将不被复制。
Shell 有不同的方式来处理尝试插入 NUL
使用命令替换。例如,Bash 只是删除了 NUL
。 s,但其他 shell 可能会在第一个 NUL
处终止替换.
作为记录,xargs
的 Gnu 实现将产生以下有用的消息:
xargs: Warning: a NUL character occurred in the input. It cannot be passed through in the argument list. Did you mean to use the --null option?
关于c - 写入以空字节开头的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341379/
2种参数:尺寸和价格。目前,我只能单击选择/突出显示尺寸列中的一个,也只能单击选择/突出显示价格列中的一个,而不会影响另一个列中的一个。 当我点击尺寸时,会添加一个 URL 参数“#size=4”。单
在css命名约定中,有什么原因,一些object最好以前缀o-和component开头> 以 c- 开头? 我知道 o- 代表 object 而 c- 代表 component,但为什么不呢?难道我们
这就很迷惑了,一下子,下面的代码就不行了。尝试让我的 Android 很好地显示网页已经显示的内容: HttpClient httpclient = new DefaultHttpClient();
我正在将我的网站发布到我无法控制的 IIS 服务器,我想从代码隐藏中了解它的 URL 是否以“http”或“https”开头。 首先,我在本地尝试了这两种解决方案,都返回了正确的值(“http”):
如果我运行: sbin/start-dfs.sh 然后它实际上并没有启动一个名称节点尽管打印: Starting namenodes on [0.0.0.0] 0.0.0.0: starting na
我正在开发一个包含一些数组的模块。现在我的数组包含: $omearray = array ( '#title' = 'title', 0 = array ( 'another array',
对于 PMD,我希望有一个规则来警告我那些以 my 开头的丑陋变量。 这意味着我必须接受所有不以my开头的变量。 所以,我需要一个正则表达式(re),其行为如下: re.match('myVar')
出于某种奇怪的原因,当我尝试使用 URLConnection 获取网页源时,我在输出中得到“null”。有人可以解释一下吗? 我的方法: public String getPageSource()
如何批量检查某个字符串(记录文本文件中的行)是否以特定单词开头? 我知道如何检查句子/行(字符串)中是否存在单词(子字符串),但我如何检查天气是否以这个词开头? 谢谢:) 最佳答案 这可以通过 FIN
我有一个列表,其中包含多个网址和一些字符串,例如#skipsideNav、#content。我正在从这些字符串中分离出 url if link.startswith('/'): local_u
我有以下 html 标记: 我想选择类 bubble bubble_white 和 bubble bubble_black。我正在考虑下面的代码,但它不起作用: $(".bubbl
我有一个用于文件名验证的正则表达式。在这里: /^[0-9a-zA-Z\^\&\'\@\{\}\[\]\,\$\=\!\-\#\(\)\.\%\+\~\_; ]+$/ 如何更改它以检查文件名不是以
我正在构建一个自动填充函数,它接受一个字符串输入并返回一个字符串建议列表。 Sequelize 的 iLike:query返回出现查询字符串的每个字符串。我想支持查询是前缀的字符串。例如当query=
我首先知道这可能是有史以来看起来最糟糕的正则表达式,但这里是。 我有这个正则表达式 (?:http://)?(?:www.)?youtu(?:be)?.(?:[a-z]){2,3}(?:[a-z/?=
尝试读取文件并根据行创建字典,跳过以#符号开头的行 文件示例: param1=val1 # here is comment 我的功能: def readFromFile(name): conf
我的程序正在读取文本文件并根据文本执行操作。但是文本的第一行是有问题的。显然它以“”开头。这弄乱了我的 startsWith() 检查。 为了理解这个问题,我使用了这段代码: System.ou
我的印象是变量名只能以字母和 _ 开头,但是在测试时,我还发现变量名可以以 $ 开头,如下所示: 代码 #include int main() { int myvar=13; int
我试过这个... Dim myMatches As String() = System.Text.RegularExpressions.Regex.Split(postRow.Item("Post")
开头
我正在使用CKEditor,默认情况下在内容的开头添加了。 即使将enterMode设置为,它也只会影响Enter键的作用,并保留开始的。 我遇到的问题是,如果文本以标记开头,它将围绕它包装,并且图像
我有一个List ,其中有五个字符串: abc def ghi jkl mno 我还有另一个字符串“pq”,我需要知道列表中的每个字符串是否都不以“pq”开头-我将如何使用LINQ(.NET 4.0)
我是一名优秀的程序员,十分优秀!