Write-up:: AIS3 PreExam 2017 - Pwn End

AIS3-2017 的題目,Pwn-end。

因為喜歡上 Pwnable 所以想要加強實力。在網路上找找古題來解,希望可以學到點東西!


0x01 分析漏洞

載下來有個ELF Executable,直接拿IDA窺視裡面有甚麼。 Disass

_start是初始化的部分,每個register都被歸零了。

然後看到_end裡面有開闢一塊0x128的buffer,然後edx = 0x148,之後呼叫了syscall,因為先前的xor rax, rax所以rax=0所以syscall會呼叫到sys_read(0, rsi, 0x148)

到這邊漏洞已經探頭了,因為edx = 0x148所以sys_read可以read進0x148個byte,但是開出來的buffer只有0x128個byte,Stack BufferOverflow Confirm!!


0x02 建構Payload

但要怎麼利用這個洞Spawn a shell呢? 在_start中下面還有一個syscall,那應該可以用他來執行sys_execve吧~

但是….我們可以控制的register只有rsi**(buf)跟rax(Function return放rax,所以可以透過控制輸入的字元長度來控制rax)**,但rdi不能控制所以不能正常的執行/bin/sh….

回頭爬爬Syscall table,發現有一個性質接近也可以執行檔案的函數stub_execveat(int dfd, const char __user *filename, const char __user *const __user *argv, const char __user*const __user *envp, int flags)

Hey!這樣子好像行得通,*filename這參數可以控制了因為他吃的是rsi,然後呼叫他的方法是把rax設定成322,所以輸入字串長度要是322但是要注意要把rdx清空,不然會爛掉。

把rdx清空不難,在_start前面有xor rdx, rdx,Stack都可以被~~灌滿了///~~跳過去就不是問題了。

所以輸入要是/bin/sh\x00 + 塞0x120個byte來填buf + xor rdx rdx的address + 更多垃圾byte來湊長度。


0x03 生成Payload

1
2
3
4
5
filename = '/bin/sh\x00'
padding = 'A' * (296 - 8) # 填剩下來的buf
xor_rdx_rdx = '\xed\x00\x40\x00\x00\x00\x00\x00'

print(filename + padding + (xor_rdx_rdx)*3 + '\x41')

0xFF 結語

原本是剛學到rop的概念,想要拿題目來練習,找著找著找到這題,覺得做法很有趣就記錄下來了w

成功get shell的時候總是很開心呢w (ノ∀`*)

Built with Hugo
Theme Stack designed by Jimmy