linkmap
1 | ezzzz: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=a331b6bb1b0e27817885f5fb27f2bf0ff9cdc0ea, stripped |
- 64位,dynamically,Full RELRO,NX
漏洞分析
栈溢出漏洞:
1 | read(0, buf, 0x100uLL); |
程序还有一个后门:
1 | void __fastcall backdoor(int index, int index2, int data) |
1 | void __fastcall backdoor2(unsigned int index, int key, int index2) |
入侵思路
程序没有 write,只能依靠栈上的两个 libc 地址进行入侵,但这两处的空间太小放不下 gadget:
1 | 00:0000│ rsp 0x7ffe79ca8838 —▸ 0x7f97290d8083 (__libc_start_main+243) ◂— mov edi, eax |
比赛时没有注意 backdoor2
有个解引用,利用这个解引用可以将 GOT 表中的 libc 地址写到 bss 中,然后低位覆盖就可以获取 write 进行泄露
需要注意的是:程序没有 pop_rdx
的 gadget,需要使用 CSU 来写入 RDX 寄存器
完整 exp 如下:
1 | # -*- coding:utf-8 -*- |
darknote
1 | GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.9) stable release version 2.31. |
1 | darknote: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=1b2dc1deeac98c6b7e7acd32d37564e1e501c66e, for GNU/Linux 3.2.0, stripped |
- 64位,dynamically,Full RELRO,Canary,NX
1 | 0000: 0x20 0x00 0x00 0x00000004 A = arch |
漏洞分析
整数溢出:
1 | sizeg = writet(); |
函数 puts
的参数可以修改:
1 | puts("=================================="); |
1 | .data:0000000000404260 20 40 40 00 00 00 00 00 off_404260 dq offset a1AddNote ; DATA XREF: menu+3D↑o |
入侵思路
使用整数溢出会导致 chunk_list
堆溢出,比赛时折腾了很多 top chunk 有关的堆风水,最后发现还是要利用大堆块申请 mmap,这样就可以在 libc 中进行溢出
1 | sla("want?",str(0x600c0000)) |
覆盖 TLS 上的 canary 就可以解锁 edit,show,dele,接着利用 svcudp_reply
完成栈迁移,然后打堆上 ORW 就可以了
完整 exp 如下:
1 | # -*- coding:utf-8 -*- |