格式字符串利用

时间:2017-02-14 19:43:12

标签: c exploit

我一直在关注一本名为 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”覆盖成为可能?

0 个答案:

没有答案