patchelf更换搜索路径时,将二进制文件先复制到/home/pwn/glibc-all-in-one-master/libs/2.23-0ubuntu11.3_amd64(需要更换的libc文件里),然后在往/home/pwn(用户文件)中复制一份

利用 patchelf --set-interpreter ./glibc-all-in-one-master/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so --set-rpath ./glibc-all-in-one-master/libs/2.23-0ubuntu11.3_amd64 0ctf_2017_babyheap 这条命令改变libc文件中的二进制文件的搜索路径,用户文件的自己就修改了。然后可以运行用户文件中的二进制文件了,但是运行不了libc文件中的二进制文件(就算后面删掉libc文件中的二进制文件,依然能运行用户文件中的二进制文件)

 

x/32xg &__malloc_hook  可以查看函数的地址及下面地址的内容    p &main_arena 只有是在有堆被释放到unsorted bin 中才能用

p &__malloc_hook 可以查看函数的地址

unsortbin 有一个特性,就是如果 usortbin 只有一个 bin ,它的 fd 和 bk 指针会指向同一个地址(unsorted bin 链表的头部),这个地址为 main_arena + 0x58

 

利用fastin attack时一定不能改bk否则unsorted_bin中就等于只有这一个堆块,就不能申请两个堆了

用fastin attack时,改完fd指针地址的内容后,malloc两次。不能先改fd,然后再free堆块,然后malloc两次,因为free会清空chunk里的内容

 unsorted bin attack   可以看出,在将 unsorted bin 的最后一个 chunk 拿出来的过程中,victim 的 fd 并没有发挥作用,所以即使我们修改了其为一个不合法的值也没有关系。然而,需要注意的是,unsorted bin 链表可能就此破坏,在插入 chunk 时,可能会出现问题。

pwngdb使用: magic 显示各个函数的地址

fmtarg+canary地址 可显示偏移

 _printf_chk是有fmt漏洞的。%n$x不能利用但并不影响我泄露栈的数据。可以用 %p%p%p一个一个输入来泄露

 

 

 

cat ./libc-2.23.so | grep -a GLIBC 判断glibc的版本

 

 

 

泄露main_arena的地址:

1.通过申请0x80及以上的chunk然后释放到unsorted bin中进行得到,malloc可以直接show,calloc会清空chunk中的内容所以不能直接show

2.申请132KB大小的话。系统会调用mmap在libc附近分配内存,经过测试虽然大于132KB可以让其分配在libc附近,但不达到一定大小,分配的内存地址和libc的偏移是不太确定的。这里借鉴了前辈的经验,分配0x200000的内存可以让偏移固定。它和lib基地址的偏移正好是这块内存区域的大小0x201000(当开辟大小>=200000时,开辟大小不一样,距离Libc基址的偏移也不一样)

3.unsorted bin into stack (详细参考CTF竞赛权威指南(pwn篇))

 

topchunk的size修改条件

  1. topchunk size > MINSIZE(0x10)
  2. top chunk inuse位为1
  3. 修改之后的 size 必须要对齐到内存页(页大小一般为0x1000)

当数据填满时,要注意用send,用senline会多一个'\n',有时候会发生未知错误(灵感来源于houseoforange_hitcon_2016中输入name)

 

判断libc的版本 string libc文件 | grep GLIBC

 

64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数,rax作为返回值.

 

开启pie调试

b *$rebase(偏移)

free_hook 原理 :__free_hook 劫持原理 | Lantern's 小站

 

 

 
 

关于字节对齐

举个例子:

 malloc(0xf8),返回0x100
 malloc(0xf9),返回0x110
 
 
posted @ 2021-09-07 20:38  ATKevin  阅读(57)  评论(0编辑  收藏  举报