最近看了一道題,write4的,里面有個(gè)很好的思路就是任意地址寫:
一起看看吧:

64位的,堆棧不可寫保護(hù),棧溢出漏洞,棧大小是:

32+8 = 40(覆蓋了ebp的)
找找system函數(shù)(plt)

找找“/bin/sh”,找不到哎:

這個(gè)不行哎,看來(lái)只能我們自己寫/bin/sh了,這里介紹一種新技能!
就是任意地址寫:舉個(gè)例子:其中r1是要寫入bss段的位置地址,r2是要寫入的字符"/bin/sh\x00"(為了湊夠8個(gè)字節(jié)),
pop r1 ; pop r2 ; ret(r1存地址,r2存信息)
mov ptr [r1] ,r2 ; ret
這樣就成功寫入了!r1和r2是隨意的,所以自由!
接下來(lái)就是要找這兩條指令!ROP走起:


找到了,接下來(lái)就是找找那個(gè)能執(zhí)行system的函數(shù)了:

找到了,腳本可以寫了:

好的,運(yùn)行:

這里能get到一個(gè)新技能了~開(kāi)心。
下面來(lái)個(gè)進(jìn)階版本的:fluff(64位)
棧溢出漏洞,堆棧不可寫保護(hù),棧大小為40(覆蓋了ebp的),找system函數(shù):

找字符串:

可見(jiàn)是無(wú)效的shell,需要自己寫:以為和之前是一樣的,試試看:

哦豁,完蛋,沒(méi)有兩個(gè)寄存器給我們能直接傳,所以只能間接傳,這里介紹一種放法:
間接傳值法,首先看看一個(gè)知識(shí)點(diǎn),異或?qū)崿F(xiàn)傳值:
A = A xor B,當(dāng)A的值為0時(shí),異或結(jié)果還是B,但是結(jié)果存到了A里面,就實(shí)現(xiàn)了間接傳值。但是前提是A 的值為0,這里就可以用自身異或來(lái)實(shí)現(xiàn):A xor A = 0,
所以又學(xué)到一個(gè)新技能:
A xor A = 0;A = A xor B(把B賦值給A),接下來(lái)就是實(shí)操了
上圖:

解釋的很清楚了,要實(shí)現(xiàn)r10和r11之間的操作,借助了下面的5條指令 ,3452的順序?qū)崿F(xiàn)了r10是bss地址值,第二次的345實(shí)現(xiàn)了r11是binsh,最后再用1的操作,實(shí)現(xiàn)mov,其中每一條指令不是都用上了,只是用其中的部分,所以其他的用junk(無(wú)用字符)填充,(還有xchg是交換兩個(gè)寄存器內(nèi)容的意思),這樣實(shí)現(xiàn)了想要的功能,剛好1中有pop rdi,所以直接可以上bss參數(shù)和system了

在這里大家可能會(huì)有個(gè)疑問(wèn),為何pop r12的值會(huì)是0,不能其他的嗎?這是個(gè)細(xì)節(jié),因?yàn)樵谡{(diào)用system函數(shù)前,還有句操作:

只有xor 0,r10的內(nèi)容才不會(huì)變,所以為了保持一致性,只能填0,這個(gè)真的是靠細(xì)節(jié)的,發(fā)現(xiàn)了就很好!
接來(lái)下運(yùn)行下:

可以,完成,總結(jié)就是學(xué)到新技巧,花式寫地址注入/bin/sh(其實(shí)寫/bin/bash(¥0)也可以),朝著下一關(guān)沖擊!