Rcalc(xctf)

本文分析了Rcalc(xctf)程序的保护机制和流程,重点讨论了栈溢出以及实现的伪Canary功能。程序中存在栈溢出,但由于使用随机数生成的Canary难以预测,因此提出了通过修改Canary值的利用策略。首先,通过泄露__libc_start_main地址,然后利用栈溢出覆盖Canary,最终实现getshell。
摘要由CSDN通过智能技术生成

0x0 程序保护和流程

保护:

protect

流程:

main()

main

init_heap()

init_heap

qword_6020F8存放着第一个申请的chunk,qword_6020F0存放着第二个申请的chunk,*(qword_6020F8+8)存放着第三个申请的chunk,*(qword_6020F0+8)存放着第四个申请的chunk

real_main()

real_main

程序没有开启canary保护,但是通过create_random()和get_random()实现了canary的功能。在输入name的时候没有限制长度,存在栈溢出。

cacl()

cacl

这个函数实现了加减乘模的功能,并且在计算之后可以选择是否调用save_result()存储计算结果。

save_result

根据*(qword_6020F8)中的值为索引存放在堆上。

0x1 利用过程

1.程序存在栈溢出,又相当于开启了canary,想要绕过canary必须弄清楚这个值怎样生成,存放在哪里。通过create_ramdom()可以得知。

create_random

通过系统生成的一个随机数作为种子,生成的随机数通过计算根据*(qword_6020F0)中的值为索引存入开辟的堆空间中。因为生成的种子是根据熵计数器的到的,所以基本上不可能计算出canary的值。

2.因为无法计算出canary的值所以想要bypass只能通过修改储存canary处的值。通过分析可以得知qword_6020F0跟canary有关,qword_6020F8跟计算结果有关。而通过init_heap()可以得知*(qword_6020F8+8)指向的chunk处于低地址,*(qword_6020F8+8)处于高地址,并且从*(qword_6020F8+8)处开始存储计算结果,而计算次数并没有做限制相当于溢出,所以可以覆盖canary的值。

3.总结上述分析得出利用过程,先泄露地址,在通过溢出修改canary的值,退出触发rop,之后故技重施就可以getshell了。

  • 泄露地址,这里要注意scanf接收到空格(0x20)和换行(0xa)就会截断,所以在payload中不能存在这两个字符,因此选择泄露__libc_start_main的地址。还有在调用printf函数时eax需要等于零,不然会报错(可以在ida中发现在调用函数之前大部分都将eax清零了)。因为在调用完函数之后返回值会存放在eax(此时eax中存放的是canary的值)中但是调用printf泄露地址的时候eax并没有清零,所以将canary的结果覆盖为零就不会报错。至于为什么要在调用函数前将eax清零没有找到一个很好的解释。
payload=padding+p64(pop_rdi_addr)+p64(libc_start_main_got)+p64(printf_plt)+p64(main_addr)
welcome(payload)
heapOverflow()
exit()

libc_start_main_addr=u64(sh.recv(6).ljust(8,'\x00'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值