pwnable.tw unexploitable writeup

本文详细介绍了如何解决pwnable.tw的unexploitable挑战,重点讨论了在没有syscall的情况下,如何通过修改read函数的最后一个字节来触发syscall,并利用栈劫持和64位通用 gadgets 实现权限提升,包括write()和execve()的调用。此外,还分享了从动态调试中学习到的知识,如系统调用函数内部的syscall实现、gdb和peda的实用技巧以及内存分页的理解。
摘要由CSDN通过智能技术生成

花了将近一天半的时间研究这一题,因为最近在熟练srop技术,所以在看到pwnbale.kr上的那道unexploitable之后,想趁热打铁来试试这道500p的题目。收货颇丰啊~~~ 虽然看了网上的思路,但exp还是自己搞了出来,还是有点小小成就感。

题目的二进制文件和libc自己去网站上找吧pwnable.tw.

首先拿到题目我们看到没有了syscall,变为了call read,这个变化导致题目直接上了一个档次。使我们的思路陷入死活同:我们需要调用system(’/bin/sh’)的话,需要先泄露libc,但是程序本身没有输出函数,我们又只能通过系统调用来调用write等函数,可是又没有syscall;或者我们需要调用execve(‘/bin/sh’),仍然需要syscall来触发。也就是说没有syscall我们什么都干不了。。。。

  1. 这个时候就需要独特的思路和脑洞。。。这也是为什么值500p的原因。。。。我们动态调试read函数内部会发现其第三条语句就是syscall,而且read()和syscall只有的LSB(最后一个有效字节)不相等!!如果先将read()的LSB改为syscall的LSB,再搭配64位通用gadgets,call [read_got]就等于jmp syscall。我们获得了syscall。
  2. 之后思路分为:
    1. 先利用 pop rbp; ret; 和 leave; ret; 来劫持栈到我们选定的bss段(实际上是加载后的空闲段)。
    2. 然后用64位通用gadgets来改写read()的LSB(这一步过后就没法调用read()了,所以我们得用其他函数来控制rax)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值