CTF-bugku-PWN


一. PWN1

題目:nc 114.116.54.89 10001

 

 1.  直接kali里面跑nc

 

 2.ls看看有啥

 

 3.明顯有一個flag

cat查看一下

 

 搞定

 

 

二 . PWN2

題目:給了nc 114.116.54.89 10003還給了一個附件

 

 1.放到ubantu中file一下,,64位,動態鏈接

 

 2.用64位的ida打開

 

 看一下main函數按f5,可知read函數有一個緩沖區漏洞

 

 后面還有一個getshell函數

 

 那么思路也就是把溢出的地址改為getshell函數執行的地址

在gdb動態調試程序

 

 按c繼續執行

 

click 100,整100個字符串測試偏移地址

cyclic 100
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaa

 

 

 

看看棧的情況,第一行這個棧保存了44個字符

 

 看看寄存器的情況,可以知道ret之前保存了44個字符,也就說另外56個字符是填滿了ret后面的區域

 

 

 那么56個字符之后就是getshell的地址(寫poc getshell地址的時候記得小端法)

 

三.pwn4

1.首先拿到程序不要慌 看看是什么文件,有沒有什么保護措施

file pwn4 很清楚是64位 動態的

 

 

 checksec看看有沒有保護措施 很顯然沒有

 

 

 2.知道沒有什么保護措施  我們就放到ida 深入分析一下

 

 

 mian函數進去看看是啥,很明顯哈  可以看到read這個函數出現緩沖區溢出的問題

 

 

 這個時候 我們清楚是緩沖區溢出了 ,就要看看這個程序里面有沒有什么shell 或者什么'/bin/sh'

目的是為了溢出之后直接覆蓋讓他執行shell

shift+F12:查找字符串

 

 

 可以i看見有個shll  雙擊進去看看

 

 

 可以發現這個shell就是個字符串沒啥用

我們直接搜一下有沒有'/bin/sh'

ROPgadget --binary pwn4 --string '/bin/sh'

 

 

 可以發現啥都沒有重新查看一下字符串,可以發現有個$0這個在linux就可以當作shell,

 

 

 接下來的思路就是把這個$0當參數傳進system函數,為啥要傳入system函數呢

原因就是因為system()會調用fork()產生子進程,由子進程來調用/bin/sh -c string來執行參數string字符串所代表的命令,此命令執行完后隨即返回原調用的進程。

意思就是 system可以調用fork()產生子進程  讓$0執行,不然$0是不是只是一個字符串呢,不能當作程序執行就沒有意義,system函數就餓可以執行它

好,既然要把$0當參數傳進system函數,我們就要知道三個東西

1.因為64位依賴寄存器傳參 當然有很多寄存器 這玩意是由順序的,不是說哪個存都行,這里面就一個參數 所以rdi先存,順序是分別用rdirsirdxrcxr8r9來傳遞參數。所以得知道rdi的地址

2.得知道$0的地址吧

3.system地址得知道吧

好一個個來

先是rdi,可以看見是0x00000000004007d3

 

 

 $0的地址 0x000000000060111f 

 

 

 

 system直接看0x000000000040075A

 

 

 

 

3.就可以寫exp把他們串起來

emmm思路是這樣

先先填充緩沖區,大小為0x10,然后覆蓋rbp,因為是64位所以8個字節,傳入rdi,咋傳呢 pop就行了 然后傳入ret的地址和$0,將棧中$0的地址彈出,存入rdi作為參數,再傳入system地址進行調用

 

 exp借用deedmind老哥!感謝

 

 

 

 

 成功拿到flag


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM