我一直在关注一本名为 Hacking:Exploit Art of Exploitation 的书,但是当我的任务是理解格式字符串漏洞利用时,我已经受到了冲击。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
int test = 43;
//int *whereat = &test;
char buffer[100];
memset(buffer, '\0', 100);
strcpy(buffer, argv[1]);
buffer[strlen(argv[1])] = '\n';
printf(buffer);
if(test == 62){
printf("\nHacked\n");
}else{
printf("\n");
printf("%d", test);
printf("\n");
}
}
上面的代码是我设置的测试假人,你必须用62覆盖测试才能显示被黑客入侵的消息。为了做到这一点,我使用gdb确定测试的地址为0x7fffffffdec4。我最熟悉四字节地址,所以当地址变长时,我不确定该怎么做。也就是说,我尝试将输入字符串的前6个字节中的较长地址写为“\ xc4 \ xde \ xff \ xff \ xff \ x7f”以及7“%08x”(以达到堆栈上的字符串)和%n至少覆盖测试变量,但是我的尝试还没有成功。 :(我正在运行ubuntu,ASLR被关闭,堆栈金丝雀也是如此,所以我不断得到的段错必须是不正确的寻址的结果。非常感谢任何帮助,如果有任何其他信息可以帮助我,请告诉我。
我用于测试的地址来自gdb:
(gdb) list 1
warning: Source file is more recent than executable.
1 #include <stdio.h>
2 #include <string.h>
3
4 int main(int argc, char *argv[]){
5
6 int test = 43;
7 //int *whereat = &test;
8 char buffer[100];
9 memset(buffer, '\0', 100);
10 strcpy(buffer, argv[1]);
(gdb) break 7
Breakpoint 1 at 0x40065c: file fmt_exploit.c, line 7.
(gdb) run aa
Starting program: /home/ubuntu/Desktop/dir/fmt_exploit aa
Breakpoint 1, main (argc=2, argv=0x7fffffffdfb8) at fmt_exploit.c:13
13 printf(buffer);
(gdb) print &test
$1 = (int *) 0x7fffffffdec4
从最后一行可以看出,测试地址是0x7fffffffdec4。如何将此地址写入我的字符串以使“%n”覆盖成为可能?