Assembly 攻击实验室阶段1分段故障

Assembly 攻击实验室阶段1分段故障,assembly,overloading,buffer,Assembly,Overloading,Buffer,我的攻击实验室的第一阶段是这样的: Ctarget通过getbuf(),我应该在其中创建一个缓冲区,让函数直接跳转到函数touch1(),而不是函数test() 根据我的理解,我应该找到缓冲区大小并为其创建一个填充,然后在填充输入之后,输入touch1()的小端地址 原来问题不是我输入的文本文件,而是ASLR。因为我在GDB中运行它,所以地址也必须从GDB中获取,并在GDB上运行。我必须通过hex2raw运行.txt文件,然后获取原始文件并将其放入GDB中,如下所示: cat phase1.t

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

Ctarget通过getbuf(),我应该在其中创建一个缓冲区,让函数直接跳转到函数touch1(),而不是函数test()

根据我的理解,我应该找到缓冲区大小并为其创建一个填充,然后在填充输入之后,输入touch1()的小端地址


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

  • cat phase1.txt |/hex2raw>raw1.txt
  • gdb ctarget
  • r
结果表明问题不是我输入的文本文件,而是ASLR。因为我在GDB中运行它,所以地址也必须从GDB中获取,并在GDB上运行。我必须通过hex2raw运行.txt文件,然后获取原始文件并将其放入GDB中,如下所示:

  • cat phase1.txt |/hex2raw>raw1.txt
  • gdb ctarget
  • r
1b12
是未重新定位的地址,一旦加载到内存中,您需要找到函数的地址。这是现代保护制度所造成的困难。如果您承诺始终在gdb下运行程序,则可以使用
info address touch1
命令查找函数的地址。@MargaretBloom感谢您的回复!我以前也尝试过info address touch1,但即使如此,它也会给我相同的地址(0x1b12),所以我认为这不是问题所在。即使如此,它也没有解释为什么在40个字节之后,它仍然给出了一个分段错误,所以我认为在逻辑或getbuf()代码中缺少了一些东西。是的,对不起。GDB使用您在
objdump
中列出的地址。我建议您在
getbuf
中设置一个断点,并跟踪它返回的位置(以及返回的内容)。请记住:您必须始终在GDB下运行应用程序,即使在测试有效负载时也是如此,除非您禁用了ASLR。您必须在GDB内启动程序,以便GDB可以从正在运行的进程中获取地址,而不仅仅是磁盘文件。GDB使用与objdump相同的binutils库读取文件元数据。@MargaretBloom获得了它,因此在运行GDB并在getbuf中设置断点后,我尝试了信息地址touch1,它返回0x55555B12,这与0x0000000000001b12非常相似。因此,如果这个地址是touch1的实际地址,我应该将其输入到ctarget中?顺便说一句,要运行我在“cat phase1.txt |./hex2raw |./ctarget”中键入的程序,
1b12
是未重新定位的地址,您需要找到加载到内存中的函数的地址。这是现代保护制度所造成的困难。如果您承诺始终在gdb下运行程序,则可以使用
info address touch1
命令查找函数的地址。@MargaretBloom感谢您的回复!我以前也尝试过info address touch1,但即使如此,它也会给我相同的地址(0x1b12),所以我认为这不是问题所在。即使如此,它也没有解释为什么在40个字节之后,它仍然给出了一个分段错误,所以我认为在逻辑或getbuf()代码中缺少了一些东西。是的,对不起。GDB使用您在
objdump
中列出的地址。我建议您在
getbuf
中设置一个断点,并跟踪它返回的位置(以及返回的内容)。请记住:您必须始终在GDB下运行应用程序,即使在测试有效负载时也是如此,除非您禁用了ASLR。您必须在GDB内启动程序,以便GDB可以从正在运行的进程中获取地址,而不仅仅是磁盘文件。GDB使用与objdump相同的binutils库读取文件元数据。@MargaretBloom获得了它,因此在运行GDB并在getbuf中设置断点后,我尝试了信息地址touch1,它返回0x55555B12,这与0x0000000000001b12非常相似。因此,如果这个地址是touch1的实际地址,我应该将其输入到ctarget中?顺便说一句,要运行我在“cat phase1.txt |/hex2raw |/ctarget”中键入的程序。
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>