BUUCTF之PWN(WP2)

[HarekazeCTF2019]baby_rop

checksec一下,发现是64位,没开canary,拖进IDA。

发现有system()函数

 

 接着发现有/bin/sh,因为这是一个64位的,所以我们需要找到pop rdi ret的gadget的地址,接着找到text段的call system 和data段的 /bin/sh的地址,然后就可以写exp.py了。

bjdctf_2020_babystack2

checksec一下,64位,然后可以用ida打开,在此期间需要看它开了什么保护措施。

 首先可以看到read()函数,它是否能发生栈溢出,取决于nbytes的大小。

我们可以由scanf()函数,输入nbytes的值,但是如果输入大于10的值,就会进入if()语句,退出程序。所以看似这里有所冲突。但是仔细看,就会发现read()里面的参数为(unsigned int) nbytes。所以只要我们输入-1,就可以绕过if()语句并且可以产生栈溢出漏洞。

bjdctf_2020_babyrop

checksec一下,为64位。保护有地址随机化和栈不可执行。用ida打开,

有两个自定义函数

 

 有puts函数并且清空了缓冲区,

 功能函数,可以从中看到有栈溢出漏洞

 从侧栏中看出程序中并没有用到system()函数,并且也没有/bin/sh,所以此时就要考虑使用ret2libc2,

 首先,可以进行第一次rop,主要目的是为了泄露出puts函数在对应的libc库中所存在的真实位置,从而计算出差,得到system和/bin/sh的地址。第二次泄露,是为了调用system函数。这样重复执行两次main()函数,就可以完成攻击,得到flag。

ciscn_2019_n_8

checksec一下,发现是32位,仔细一看开了各种保护,有点被吓到

 IDA反汇编,发现只要将var[13]的值改为17,就可以调用system()函数,拿到shell

get_started_3dsctf_2016

checksec 一下,32位,由于是静态链接,第一反应是ret2syscall,但是试了半天都不对,所以瞻仰了大佬们的wp,由此学到了一个新的c语言函数,一个可以修改内存权限的函数。

 通过这个函数将shellcode写入数据段,首先我们找到data段的地址,并且确定长度,接着由于要写入shellcode所以我们要调用read()函数,接着确定read()函数的三个参数。由于是32位,所以我们需要把参数写入栈中,由于传入参数过多,所以需要进行堆栈平衡。所以需要使用rop,我们找到3个连续的pop,在使用mprotect()函数和read()函数后可以分别添上pop3,最后sendline()一下shellcode.

 

 但是跟着大佬写exp的时候发现了错误在第一次构造的payload()中没有写入data段的地址,造成无法攻击成功,此处猜测是因为需要将返回地址指向data段,否则无法将shellcode正确写入。做了三个小时终于将这道题彻底搞懂。啊啊啊啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值