萌新带你开车上p站(番外篇)(3)
2022-11-12 来源:acgdir.com
关键的地方:
1. A在栈上的地址是ebp-0x14,即ebp-0x14=stack=&A
2. 最后的ret,作用是赋值给eip寄存器,而我们要做的就是修改esp寄存器的内容为shellcode的地址
3. 通过lea esp,[ecx-0x4]可以知道esp的值来自[ecx-4]
4. leave指令对esp没影响
5. mov ecx,DWORD PTR[ebp-0x4],可知,ecx的值来自[ebp-4]
6. 综上,我们只需要把shellcode的地址写到[ebp-8]地址(事实上这样很不方便,我们下面实际上是把shellcode地址 4写到[ebp-4]地址,这样的话,shellcode地址 4-4,传给esp的时候恰好就是shellcode的地址)
推论:
(1)由1得,ebp-4等于stack 0x14-0x4
(2)heap_是A在堆中的地址,加上在buf前有fd,bk链各个指针共8个字节,所以shellcode的地址是写到了heap 0x8处,所以 (shellcode地址 4)=(heap 0x8) 0x4
只要实现了* (ebp-4)=&shellcode 4,则ecx就被覆盖成了&shellcode 4,然后执行了
我们就拿到shell了
我们前面留下了一个问题:被删除的chunk为B,修改B的fd,bk,修改后会引发什么漏洞
先举个简单的例子看看,设我们修改了B->fd=!!!!,B->bk=@@@@,在调用unlink(B)时,
1. A在栈上的地址是ebp-0x14,即ebp-0x14=stack=&A
2. 最后的ret,作用是赋值给eip寄存器,而我们要做的就是修改esp寄存器的内容为shellcode的地址
3. 通过lea esp,[ecx-0x4]可以知道esp的值来自[ecx-4]
4. leave指令对esp没影响
5. mov ecx,DWORD PTR[ebp-0x4],可知,ecx的值来自[ebp-4]
6. 综上,我们只需要把shellcode的地址写到[ebp-8]地址(事实上这样很不方便,我们下面实际上是把shellcode地址 4写到[ebp-4]地址,这样的话,shellcode地址 4-4,传给esp的时候恰好就是shellcode的地址)
推论:
(1)由1得,ebp-4等于stack 0x14-0x4
(2)heap_是A在堆中的地址,加上在buf前有fd,bk链各个指针共8个字节,所以shellcode的地址是写到了heap 0x8处,所以 (shellcode地址 4)=(heap 0x8) 0x4
只要实现了* (ebp-4)=&shellcode 4,则ecx就被覆盖成了&shellcode 4,然后执行了
我们就拿到shell了
我们前面留下了一个问题:被删除的chunk为B,修改B的fd,bk,修改后会引发什么漏洞
先举个简单的例子看看,设我们修改了B->fd=!!!!,B->bk=@@@@,在调用unlink(B)时,