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