24-07-15
本周学习总结
CTFの康复训练
全局常量声明:文章内容仅是由教程观点和自己总结获得,仅供参考。
一、[2024春秋杯夏季联赛]–stdout
check:

64位程序,开启NX。
ida分析:
main:

vuln:

看起来是个常见的缓冲区溢出漏洞,但是在init函数中设置输出缓冲区初始化的时候关闭了输出导致不能产生然后回显,所以不能暴露任何地址或信息,还容易造成缓冲区混乱。
init:

在libc源代码中发现了函数setvbuf(0x84CE0)附近有syscall(0x84CC9),可以通过修改got表改setvbuf为syscall,通过ROP和read调用来在bss段上写入一个”/bin/sh\x00”,通过read的输入来设置rax=0x3B。最后通过ret_csu来建立ROP最后getshell。
在exp编写过程中需要时刻注意缓冲区混乱问题,该填充的地方填充,该暂停的地方暂停,使用gdb调试需要取消注释pause(),直接运行不需要取消注释pause()。
exp:
1 | |
二、[2024春秋杯夏季联赛]–Shuffled_Execution
check:

64位程序,保护全开。
沙盒规则:

禁用了获取shell的可能,考虑通过ORW来获取flag,禁用了部分ORW函数,通过筛选考虑使用openat代替open,使用mmap代替read,使用writev代替write。
openat:
rdi = -100(代表当前目录)
rsi = “flag”的地址
rdx= 0(只读方式打开)
rax= 257
mmap:
rdi = 0
rsi = 0x20(读取的大小)
rdx = 1(可读权限)
r10 = 0x2
r8 = 3(fd文件流)
r9 = 0
writev:
rdi = 1
rsi = 指向flag起始地址的地址(例:0x13374f0 —▸ 0x7efff6e4e000 ◂— ‘flag{test}\n’)
rdx = 1
该函数输出的长度由rsi+0x8地址指向的值来决定,通过mov qword ptr [rsi+0x8], 0x20来设置输出0x20字符
ida:
mian:

shffle:

entrance:

函数shffle看起来是混淆我们输入的内容,但是如果我们在输入的内容最前面加入\x00来触发截断使得a2的值小于或等于1就不会触发混淆。entrance函数直接执行了我们的shellcode。
exp:
1 | |
三、[2024春秋杯夏季联赛]–SavethePrincess
check:

64位程序,保护全开。
沙盒规则:

ida分析:
main:

init:

生成了8位的密码在love中,范围是”a”-“z”。
magic:

magic中发现了字符串格式化漏洞(不是哥们,真爆破啊)。
Challenge:

缓冲区溢出漏洞。
通过爆破密码来获得字符串格式化的机会,泄漏stack地址、libc基地址、canary的值。
通过mprotect函数来使得栈可读可写可执行,在栈上写shellcode,通过openat+mmap+write实现ORW。
exp:
1 | |
四、[WKCTF]–Easy_stack–手气局
check:

开启了NX和PIE。
漏洞点:

存在字符串格式化漏洞,可用于泄漏__libc_start_main的地址。


echo_inner存在一个offbynull,这意味着rbp可能会变化到我们输入的地址中,再配合合适的payload构造和一点点小手气,我们就能getshell。
exp:
1 | |
五、[WKCTF]–baby_heap–看不懂,我转fastbin打got表的(
TOP_chunk attack! - 0x71创造 - malloc(0)! - read(0,ptr,0x0)! -
Malloc_got -> one_getgad_addr ! )
check:

64位程序,开启canary和NX
ida:
main:

add:

edit:

show:

漏洞点为堆溢出,该堆题没有free函数,标准的house of orange,但是show函数只能输出堆块的fd地址,而我们想要的heap基地址在fd+0x10的位置,所以直接的house of orange仍然是打不了的,这里官方是推出了修复堆块地址的办法,熊队则是通过add设置堆块大小时将system的地址拼在了bss段上。
这里推荐另外一种朴素的办法。house of orange一般会预留较大的堆块使得被free的堆块进入unsortbins中,但是如果预留的堆块较小的话则会进入的fastbin中,我们可以利用fastbin attack来控制bss段上存放堆地址的位置来实现地址任意写,然后修改malloc的got表为one_gadget来getshell。
exp:
1 | |
下周学习计划
| 应该要做的事情 |
对pwn查漏补缺,准备扩展其他方向
学习感受
学就完事了。