Pwnable.tw-unexploitable
Author: 堇姬Naup
IDA分析
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
分析
非常明顯的buffer overflow
1 | pwndbg> checksec |
並且甚麼保護都沒開
可以蓋ret address來做任意跳轉
那我究竟可以跳去哪,一開始先來看能不能寫ROP
1 | naup@naup-virtual-machine:~/Desktop/pwn/pwnable/unexpectable$ file unexploitable |
一個dynamic並且gadget沒有很多
不過這題有看到csu
可以打ret2csu
1 | .text:00000000004005E6 mov rbx, [rsp+38h+var_30] |
這裡可以控
rbx、rbp、r12、r13、r14、r15
1 | .text:00000000004005D0 mov rdx, r15 |
另外這裡有call跟可以透過r15、r14、r13控rdx、rsi、edi
首先想法是call read,如果我能夠call read,去改GOT sleep成可以利用的
最後跳上去
然而我們沒有libc base,但觀察一下libc
1 | 1845: 00000000000cb680 74 FUNC WEAK DEFAULT 13 sleep@@GLIBC_2.2.5 |
sleep在libc的offset是0xcb680
我們都知道ASLR是libc base + offset
並且libc base低位是000
代表如果有可以利用的gadget可以透過改1 byte低位就可以利用
這裡最後選擇syscall(過濾一下offset是0xcb6開頭的)
1 | 0x00000000000cb6d8 : adc byte ptr [rax + 0x22], bh ; syscall |
這條看起來不錯
1 | 0x00000000000cb650 : mov eax, 0x25 ; syscall |
前面佔0x5 byte所以實際上syscall是0xcb655
把低位改成0x55就行了
最後就可以透過r12跳上sysacll
那前置作業就是再寫一個binsh到bss段,另外rax在read完後會把rax設為輸入的byte數
最後設定為rdx rdi rsi
rax也正確,跳上去syscall就成功get shell
script
1 | from pwn import * |
感覺是非預期解