vxworks文件系统分析

本文介绍了如何使用binwalk提取和分析TP-Link固件,包括设置字节序、识别加载地址、修复符号表,以及使用idapython脚本来恢复和创建函数符号,提及了VxWorks和VxHunter工具的应用。

参考https://www.freebuf.com/articles/endpoint/335030.html

测试固件 https://service.tp-link.com.cn/detail_download_7989.html

固件提取

binwalk解压固件,在第一部分即为要分析的二进制文件,可以拖进ida分析

(img-rLhyFmpK-1691033042842)(https://secure2.wostatic.cn/static/uzN93pcTZUwkK1cPjkA2TV/image.png

设置为arm小端字节序,点set

在这里插入图片描述

随便选择加载地址

在这里插入图片描述

进来之后可以看到真正的加载地址

在这里插入图片描述

修复符号

VxWorks采用usrInit进行栈初始化,usrInit是VxWorks系统引导后运行的第一个函数。调用bzero函数对bss区的数据进行清零。

binwalk 解压得到所有内容,通过grep 搜索符号表

grep -nr "bzero" .

xxd得到对应的十六进制数

xxd -g 1 -u ./15CBBA >15CBBA.chr

确定符号表中符号的偏移,通过出现连续字符串的开始,即0x001a728

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNAqux7c-1691033042845)(https://secure2.wostatic.cn/static/nwoxbBWYMvVEe5bDYJ13iG/image.png?auth_key=1691033035-jSmBWdaxkSDidDnxYhjrqb-0-ae27733d97336f8f2c6794e7ad3842ce)]

在该文件的开头记录着符号表的偏移,54对应flag,0x40373684对应AES_CMAC的偏移

在这里插入图片描述

使用idapython脚本恢复符号表

  • 重定位加载地址
  • 读取符号表文件,定位到对应偏移分别得到地址和符号名
  • 创建函数并设置函数名
from  idaapi import *
import idc
def has_symbol(address):
    symbol_name = idc.get_name(address)
    return bool(symbol_name)

def read_symbol_table(filename, symbol_address_offset,symbol_offset):
    with open(filename, "rb") as f:
        f.seek(symbol_address_offset)
        content=f.read()
    with open(filename, "rb") as f:
        f.seek(symbol_offset)
        content_symbol=f.read()
    symbol_address=[]    
    for item in range(0,len(content),8):
        if item>=symbol_offset:
            break
        symbol_data = content[item:item+4] # Assuming 32-bit address, change the size as needed
        symbol_address.append(int.from_bytes(symbol_data, byteorder="big"))

    symbol_list=content_symbol.split(b"\x00")
    print("found address,symbol len",len(symbol_address),len(symbol_list))
    for a,s in zip(symbol_address,symbol_list):
        yield (a,s)


def create_symbol(symbol_address, symbol_name):
    add_func(symbol_address)
    idc.set_name(symbol_address, symbol_name.decode(), SN_NOCHECK)
def init(ida_load_addr):
    rebase_program(ida_load_addr,8) # 测试时ida会根据前一次的地址加上这个偏移得到基地址,刚开始设置为0,只执行一次即可

def main():
    filename = "/Users/guosiyu/Desktop/aiwencode/loudong_liyong/tplink/_wdr7660gv1-cn-up_2019-08-30_10.37.02.bin.extracted/15CBBA"
    current_base=get_imagebase()
    ida_load_addr=0x40205000-current_base
    symbol_address_offset = 0xc  # Offset where the symbol address is located in the file
    symbol_offset = 0x001a728  # Offset of the symbol in the file

    init(ida_load_addr)
    auto_wait()
    for addr,symbol in read_symbol_table(filename, symbol_address_offset,symbol_offset):
        print("found address,symbol:",hex(addr),symbol)
        if(has_symbol(addr)):
            continue
        create_symbol(addr, symbol)
    # symbol_address = base_address + symbol_address_offset


    # symbol_name = "your_symbol_name"  # Replace this with the desired symbol name

    
    # print(f"Created symbol: {symbol_name} at address: 0x{symbol_address:08X}")

if __name__ == "__main__":
    main()

补充

工具 https://github.com/PAGalaxyLab/vxhunter好像也可以,未测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值