一. 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先存,順序是分別用rdi
、rsi
、rdx
、rcx
、r8
、r9
來傳遞參數。所以得知道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