参考openwall的这篇分析文章发现,gethostbyname_r存在一个8字节的溢出。题目转化为堆块重叠做。
远程使用了rpath来patch。具体的命令为
1 | patchelf --set-interpreter {pwd}/ld.so.2 --set-rpath {pwd} ./pwn |
远程是ubunt 18 04
堆块排布是我觉得最为恶心的地方。想要malloc一块大小为x的chunk,会同时分配出x
、x+0x20
、0x30
三个堆块。
用来泄露libc的结构体中h_name
(+0)和h_addr_list
(+0x18)可以用于信息泄露。
1 | struct hostent |
构造堆的时候如果想通过在h_name
的位置写入一unsorted bin的地址来泄露的话,还必须提前把h_addr_list指向的位置清零,不然解引用非法指针的话程序直接崩溃。
构造完fastbin double free后不能写入非法的字符,只好将堆块倒数第二个字节抬升至0x00
,提前控制好这个位置堆块上的fd。
写入非法的字符能够写在NameBuf中,但是进入gethostbyname_r中后会引发一系列的堆块分配,导致构造好的fastbin链被malloc consoladate,触发安全检查而崩溃。
1 | #!/usr/bin/python |