fcalc
1 | fcalc: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=05285bcf7cd192619ab73f7c8e90e4e0d357c11c, for GNU/Linux 3.2.0, stripped |
- 64位,dynamically,Full RELRO,PIE
程序分析
程序大致上实现了一个计算器,输入数字可以将数字压栈,输入运算符号 +-*/
可以从栈中弹出栈顶的两个数字,进行运算后将结果压回
入侵思路
关键点就是在栈上注入一个 shellcode,需要通过下面的检查:
1 | for ( j = 0; j <= 0x2F; ++j ) |
当然不可能整个 shellcode 都通过检查,通过 GDB 调试可以发现栈上有个栈地址,于是需要写一个 add rsp,offset;ret;
跳转到这个栈地址上,在这里布置 shellcode
完整 exp 如下:
1 | # -*- coding:utf-8 -*- |
drop
1 | GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.9) stable release version 2.31. |
1 | drop: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=3bdb633ba28af9d5592d174f3b181e4b5485e8db, for GNU/Linux 3.2.0, stripped |
- 64位,dynamically,Full RELRO,NX,PIE
漏洞分析
这个题的伪代码有点怪,正常分析程序功能有点困难,需要根据输入的内容来判断程序各个模块对堆的影响
我一般遇到这种难以分析的题目都会直接开始调试:
1 | for i in range(9): |
1 | tcachebins |
- 这里大概推测一下,函数
bubble
的功能如下:- 当 key 为0时,释放第 index 个 chunk
- 当 key 为1时,将前 index 个 chunk 全部释放,申请并拷贝到新的 chunk 中
程序的 bubble
可以用于释放堆块,在其中有 UAF 漏洞
入侵思路
利用 UAF 漏洞可以完成泄露:
1 | for i in range(9): |
- 上面这个堆风水就是猜出来的,遇到这种不好分析的题目一定不要执着于逆向,要适当猜测数据
完整 exp 如下:
1 | # -*- coding:utf-8 -*- |
starvm
1 | GNU C Library (Ubuntu GLIBC 2.35-0ubuntu3.1) stable release version 2.35. |
1 | starvm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f7648c6285dbb9299e6ee84f7b48f53de6626be6, for GNU/Linux 3.2.0, stripped |
- 64位,dynamically,Partial RELRO,Canary,NX
漏洞分析
程序的核心结构体如下:
1 | 00000000 Chunk struc ; (sizeof=0x7C, mappedto_9) |
在 case-10
中没有 offset 检查,可以溢出到核心结构体中:
1 | case 10: // lea |
1 | case 12: // lea3 |
入侵思路
由于程序是提供了 stack_addr 的,通过程序的溢出,可以将 answer_addr 覆盖为 stack_addr,然后就可以修改栈上的数据了
劫持栈,利用 puts 泄露 libc_base,然后写 main 函数地址循环执行程序:
1 | ru("your vm starts at ") |
最后在栈上覆盖一个 ROP 就可以了
完整 exp 如下:
1 | # -*- coding:utf-8 -*- |