2021-01-08 08:35:03 +00:00
<!DOCTYPE html>
2021-04-10 12:03:10 +00:00
< html class = "theme-next muse use-motion" lang = "zh-Hans" >
2021-01-08 08:35:03 +00:00
< head > < meta name = "generator" content = "Hexo 3.8.0" >
< meta charset = "UTF-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1, maximum-scale=1" >
< meta name = "theme-color" content = "#222" >
2021-04-10 19:19:48 +00:00
< script src = "/lib/pace/pace.min.js?v=1.0.2" > < / script >
< link href = "/lib/pace/pace-theme-center-atom.min.css?v=1.0.2" rel = "stylesheet" >
2021-01-08 08:35:03 +00:00
< meta http-equiv = "Cache-Control" content = "no-transform" >
< meta http-equiv = "Cache-Control" content = "no-siteapp" >
< link href = "/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel = "stylesheet" type = "text/css" >
< link href = "/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel = "stylesheet" type = "text/css" >
< link href = "/css/main.css?v=5.1.4" rel = "stylesheet" type = "text/css" >
< link rel = "apple-touch-icon" sizes = "180x180" href = "/images/hackerrank.png?v=5.1.4" >
< link rel = "icon" type = "image/png" sizes = "32x32" href = "/images/hackerrank.png?v=5.1.4" >
< link rel = "icon" type = "image/png" sizes = "16x16" href = "/images/hackerrank.png?v=5.1.4" >
< link rel = "mask-icon" href = "/images/logo.svg?v=5.1.4" color = "#222" >
2021-03-02 06:31:33 +00:00
< meta name = "keywords" content = "UPnP,固件模拟,Netgear,NVRAM," >
2021-01-08 08:35:03 +00:00
2021-04-11 06:53:08 +00:00
< link rel = "alternate" href = "/atom.xml" title = "混元霹雳手" type = "application/atom+xml" >
2021-01-08 08:35:03 +00:00
2021-04-10 13:53:56 +00:00
< meta name = "description" content = "还记得固件仿真吗? 先试着快速解决nvram" >
2021-03-02 06:31:33 +00:00
< meta name = "keywords" content = "UPnP,固件模拟,Netgear,NVRAM" >
2021-01-08 08:35:03 +00:00
< meta property = "og:type" content = "article" >
< meta property = "og:title" content = "自动化获取nvram配置" >
< meta property = "og:url" content = "https://cool-y.github.io/2021/01/08/nvram-config/index.html" >
< meta property = "og:site_name" content = "混元霹雳手" >
2021-04-10 13:53:56 +00:00
< meta property = "og:description" content = "还记得固件仿真吗? 先试着快速解决nvram" >
2021-01-08 08:35:03 +00:00
< meta property = "og:locale" content = "zh-Hans" >
< meta property = "og:image" content = "https://res.cloudinary.com/dozyfkbg3/image/upload/v1610094619/nvram/image_24.png" >
< meta property = "og:image" content = "https://res.cloudinary.com/dozyfkbg3/image/upload/v1610094620/nvram/image_23.png" >
2021-04-11 06:53:08 +00:00
< meta property = "og:updated_time" content = "2021-04-11T06:10:57.032Z" >
2021-01-08 08:35:03 +00:00
< meta name = "twitter:card" content = "summary" >
< meta name = "twitter:title" content = "自动化获取nvram配置" >
2021-04-10 13:53:56 +00:00
< meta name = "twitter:description" content = "还记得固件仿真吗? 先试着快速解决nvram" >
2021-01-08 08:35:03 +00:00
< meta name = "twitter:image" content = "https://res.cloudinary.com/dozyfkbg3/image/upload/v1610094619/nvram/image_24.png" >
< script type = "text/javascript" id = "hexo.configurations" >
var NexT = window.NexT || {};
var CONFIG = {
root: '/',
2021-04-10 12:03:10 +00:00
scheme: 'Muse',
2021-01-08 08:35:03 +00:00
version: '5.1.4',
2021-04-10 20:13:11 +00:00
sidebar: {"position":"left","display":"always","offset":12,"b2t":false,"scrollpercent":true,"onmobile":true},
2021-01-08 08:35:03 +00:00
fancybox: true,
tabs: true,
motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
duoshuo: {
userId: '0',
author: '博主'
},
algolia: {
applicationID: '',
apiKey: '',
indexName: '',
hits: {"per_page":10},
labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
}
};
< / script >
< link rel = "canonical" href = "https://cool-y.github.io/2021/01/08/nvram-config/" >
< title > 自动化获取nvram配置 | 混元霹雳手< / title >
< / head >
< body itemscope itemtype = "http://schema.org/WebPage" lang = "zh-Hans" >
< div class = "container sidebar-position-left page-post-detail" >
< div class = "headband" > < / div >
< header id = "header" class = "header" itemscope itemtype = "http://schema.org/WPHeader" >
< div class = "header-inner" > < div class = "site-brand-wrapper" >
< div class = "site-meta " >
< div class = "custom-logo-site-title" >
< a href = "/" class = "brand" rel = "start" >
< span class = "logo-line-before" > < i > < / i > < / span >
< span class = "site-title" > 混元霹雳手< / span >
< span class = "logo-line-after" > < i > < / i > < / span >
< / a >
< / div >
2021-04-10 20:10:04 +00:00
< p class = "site-subtitle" > Battle⚔️ 2 the world🌎< / p >
2021-01-08 08:35:03 +00:00
< / div >
< div class = "site-nav-toggle" >
< button >
< span class = "btn-bar" > < / span >
< span class = "btn-bar" > < / span >
< span class = "btn-bar" > < / span >
< / button >
< / div >
< / div >
< nav class = "site-nav" >
< ul id = "menu" class = "menu" >
< li class = "menu-item menu-item-home" >
< a href = "/" rel = "section" >
< i class = "menu-item-icon fa fa-fw fa-home" > < / i > < br >
首页
< / a >
< / li >
< li class = "menu-item menu-item-about" >
< a href = "/about/" rel = "section" >
< i class = "menu-item-icon fa fa-fw fa-user" > < / i > < br >
关于
< / a >
< / li >
< li class = "menu-item menu-item-tags" >
< a href = "/tags/" rel = "section" >
< i class = "menu-item-icon fa fa-fw fa-tags" > < / i > < br >
标签
< / a >
< / li >
< li class = "menu-item menu-item-categories" >
< a href = "/categories/" rel = "section" >
< i class = "menu-item-icon fa fa-fw fa-th" > < / i > < br >
分类
< / a >
< / li >
< li class = "menu-item menu-item-archives" >
< a href = "/archives/" rel = "section" >
< i class = "menu-item-icon fa fa-fw fa-archive" > < / i > < br >
归档
< / a >
< / li >
< li class = "menu-item menu-item-bookmarks" >
< a href = "/bookmarks/" rel = "section" >
< i class = "menu-item-icon fa fa-fw fa-map" > < / i > < br >
书签
< / a >
< / li >
2021-04-11 06:53:08 +00:00
< li class = "menu-item menu-item-album" >
< a href = "/album/" rel = "section" >
2021-01-08 08:35:03 +00:00
< i class = "menu-item-icon fa fa-fw fa-heartbeat" > < / i > < br >
2021-04-11 06:53:08 +00:00
相簿
2021-01-08 08:35:03 +00:00
< / a >
< / li >
< / ul >
< / nav >
< / div >
< / header >
< main id = "main" class = "main" >
< div class = "main-inner" >
< div class = "content-wrap" >
< div id = "content" class = "content" >
< div id = "posts" class = "posts-expand" >
< article class = "post post-type-normal" itemscope itemtype = "http://schema.org/Article" >
< div class = "post-block" >
< link itemprop = "mainEntityOfPage" href = "https://cool-y.github.io/2021/01/08/nvram-config/" >
< span hidden itemprop = "author" itemscope itemtype = "http://schema.org/Person" >
< meta itemprop = "name" content = "Cool-Y" >
< meta itemprop = "description" content >
< meta itemprop = "image" content = "/images/avatar.png" >
< / span >
< span hidden itemprop = "publisher" itemscope itemtype = "http://schema.org/Organization" >
< meta itemprop = "name" content = "混元霹雳手" >
< / span >
< header class = "post-header" >
< h1 class = "post-title" itemprop = "name headline" > 自动化获取nvram配置< / h1 >
< div class = "post-meta" >
< span class = "post-time" >
< span class = "post-meta-item-icon" >
< i class = "fa fa-calendar-o" > < / i >
< / span >
< span class = "post-meta-item-text" > 发表于< / span >
< time title = "创建于" itemprop = "dateCreated datePublished" datetime = "2021-01-08T16:27:26+08:00" >
2021-01-08
< / time >
< / span >
< span class = "post-category" >
< span class = "post-meta-divider" > |< / span >
< span class = "post-meta-item-icon" >
< i class = "fa fa-folder-o" > < / i >
< / span >
< span class = "post-meta-item-text" > 分类于< / span >
< span itemprop = "about" itemscope itemtype = "http://schema.org/Thing" >
< a href = "/categories/IOT/" itemprop = "url" rel = "index" >
< span itemprop = "name" > IOT< / span >
< / a >
< / span >
< / span >
< span id = "/2021/01/08/nvram-config/" class = "leancloud_visitors" data-flag-title = "自动化获取nvram配置" >
< span class = "post-meta-divider" > |< / span >
< span class = "post-meta-item-icon" >
< i class = "fa fa-eye" > < / i >
< / span >
< span class = "post-meta-item-text" > 阅读次数: < / span >
< span class = "leancloud-visitors-count" > < / span >
< / span >
< div class = "post-wordcount" >
< span class = "post-meta-item-icon" >
< i class = "fa fa-file-word-o" > < / i >
< / span >
< span title = "字数统计" >
1.1k 字
< / span >
< span class = "post-meta-divider" > |< / span >
< span class = "post-meta-item-icon" >
< i class = "fa fa-clock-o" > < / i >
< / span >
< span title = "阅读时长" >
2021-04-11 06:53:08 +00:00
4 分钟
2021-01-08 08:35:03 +00:00
< / span >
< / div >
2021-04-10 13:53:56 +00:00
< div class = "post-description" >
还记得固件仿真吗? 先试着快速解决nvram
< / div >
2021-01-08 08:35:03 +00:00
< / div >
< / header >
< div class = "post-body" itemprop = "articleBody" >
< p > ARMX作者说, nvram的内容必须从正在运行的设备中提取。< br > 一种方法是转储包含nvram数据的mtdblock, /proc/mtd可能有助于识别哪个mtdblock包含nvram。< br > 另一种方法是, 如果您可以通过UART进行命令行访问( 当然可以访问实际的硬件) , 某些固件会提供nvram命令, 运行“ nvram show”也可以获取nvram内容。< br > < a href = "https://github.com/therealsaumil/armx/issues/4" target = "_blank" rel = "noopener" > https://github.com/therealsaumil/armx/issues/4< / a > < / p >
< p > 知道创宇的研究人员说, nvram配置, 可以查看对应的汇编代码逻辑( 配置的有问题的话很容易触发段错误) 。< / p >
< p > 我需要无需硬件自动化的处理大批设备的nvram配置, 上面两种方法都无法适用。但我发现Netgear的nvram配置有这两个te’ d< / p >
< ul >
< li > upnp等二进制程序通过nvram_match来匹配nvram变量与预期值< / li >
< li > libnvram在data段存储了设备的默认nvram配置, < strong > 数据段< / strong > ( data segment) 通常是指用来存放< a href = "https://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F" target = "_blank" rel = "noopener" > 程序< / a > 中已< a href = "https://zh.wikipedia.org/w/index.php?title=%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%94%E4%B8%8D%E4%B8%BA0&action=edit&redlink=1" target = "_blank" rel = "noopener" > 初始化且不为0< / a > 的< a href = "https://zh.wikipedia.org/wiki/%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F" target = "_blank" rel = "noopener" > 全局变量< / a > 的一块内存区域。数据段属于< a href = "https://zh.wikipedia.org/wiki/%E9%9D%99%E6%80%81%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D" target = "_blank" rel = "noopener" > 静态内存分配< / a > 。< / li >
< / ul >
< p > 于是根据这两个事实做了两个实验:< / p >
< h2 id = "match函数" > < a href = "#match函数" class = "headerlink" title = "match函数" > < / a > match函数< / h2 > < p > 该函数的逻辑如下, a1为要查询的key, a2为待比较的对应value, 调用nvram_get获得nvram中a1的value, 然后和a2比较, 相同的话返回1。< / p >
2021-04-11 06:53:08 +00:00
< figure class = "highlight c" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "keyword" > const< / span > < span class = "keyword" > char< / span > *__< span class = "function" > fastcall < span class = "title" > acosNvramConfig_match< / span > < span class = "params" > (< span class = "keyword" > int< / span > a1, < span class = "keyword" > const< / span > < span class = "keyword" > char< / span > *a2)< / span > < / span > < / span > < br > < span class = "line" > < span class = "function" > < / span > { < / span > < br > < span class = "line" > < span class = "keyword" > const< / span > < span class = "keyword" > char< / span > *v2; < span class = "comment" > // r4< / span > < / span > < br > < span class = "line" > < span class = "keyword" > const< / span > < span class = "keyword" > char< / span > *result; < span class = "comment" > // r0< / span > < / span > < br > < span class = "line" > < span class = "keyword" > int< / span > v4; < span class = "comment" > // [sp+0h] [bp-1008h]< / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > v2 = a2;< / span > < br > < span class = "line" > result = (< span class = "keyword" > const< / span > < span class = "keyword" > char< / span > *)j_nvram_get(a1, & v4, < span class = "number" > 4096< / span > );< / span > < br > < span class = "line" > < span class = "keyword" > if< / span > ( result )< / span > < br > < span class = "line" > result = (< span class = "keyword" > const< / span > < span class = "keyword" > char< / span > *)(< span class = "built_in" > strcmp< / span > (result, v2) == < span class = "number" > 0< / span > );< / span > < br > < span class = "line" > < span class = "keyword" > return< / span > result;< / span > < br > < span class = "line" > } < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2021-01-08 08:35:03 +00:00
< p > 在upnp二进制程序汇编代码中, 调用acosNvramConfig_match来比较nvram< br > < img src = "https://res.cloudinary.com/dozyfkbg3/image/upload/v1610094619/nvram/image_24.png" alt > < br > 我做出了一个假设: 所有a2都是能够使程序正常运行的nvram值, 现在想要获取它。编写IDA脚本如下: < / p >
2021-04-11 06:53:08 +00:00
< figure class = "highlight" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > def GetAddr(func_name):< / span > < br > < span class = "line" > func_list = Functions()< / span > < br > < span class = "line" > < span class = "keyword" > for< / span > func in func_list:< / span > < br > < span class = "line" > name = GetFunctionName(func)< / span > < br > < span class = "line" > < span class = "keyword" > if< / span > func_name == name:< / span > < br > < span class = "line" > print(name,hex(func))< / span > < br > < span class = "line" > func_addr=func< / span > < br > < span class = "line" > < span class = "keyword" > return< / span > func_addr< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > func_addr = GetAddr('acosNvramConfig_match')< / span > < br > < span class = "line" > #func_addr=< span class = "number" > 0xa3d4< / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > for< / span > x in XrefsTo(func_addr,flags=< span class = "number" > 0< / span > ):< / span > < br > < span class = "line" > print < span class = "string" > "XrefsTo nvram-match func addr: %s"< / span > %hex(x.frm)< / span > < br > < span class = "line" > match_addr = x.frm< / span > < br > < span class = "line" > val_addr = PrevHead(match_addr)< / span > < br > < span class = "line" > key_addr = PrevHead(val_addr)< / span > < br > < span class = "line" > if GetMnem(key_addr) == 'LDR':< / span > < br > < span class = "line" > instr = GetDisasm(prevaddr)< / span > < br > < span class = "line" > #print('LDR instruction: %s'%instr)< / span > < br > < span class = "line" > addr = GetOperandValue(key_addr,< span class = "number" > 1< / span > )< / span > < br > < span class = "line" > key = GetString(Dword(addr))< / span > < br > < span class = "line" > print('nvram key: %s'%key)< / span > < br > < span class = "line" > if GetMnem(val_addr) == 'LDR':< / span > < br > < span class = "line" > instr = GetDisasm(prevaddr)< / span > < br > < span class = "line" > #print('LDR instruction: %s'%instr)< / span > < br > < span class = "line" > addr = GetOperandValue(val_addr,< span class = "number" > 1< / span > )< / span > < br > < span class = "line" > val = GetString(Dword(addr))< / span > < br > < span class = "line" > print('nvram value: %s'%val)< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2021-01-08 08:35:03 +00:00
< ol >
< li > GetAddr(func_name) 根据函数名获得地址, 这里获得了’ acosNvramConfig_match’ 的地址0xa3d4; < / li >
< li > 找到所有引用过该函数的地址, 并且提取作为参数的数据。获取到函数的引用非常的简单, 只需要使用XrefsTo()这个API函数就能达到我们的目的。< / li >
< li > value是调用match函数的前一条指令; key是调用match函数的前两条指令; 操作码都是LDR;< / li >
< li > 使用GetOperandValue() 这个指令得到第二个操作数的值。注意该值存放的是“存放字符串地址”的地址< / li >
< li > 使用Dword(addr)获取“存放字符串地址”, 使用GetString()这个API函数从该偏移提取字符串< / li >
< / ol >
< p > 粘贴部分结果,有大量的重复,还有许多键值不存在,假设不成立。< / p >
2021-04-11 06:53:08 +00:00
< figure class = "highlight shell" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > ('acosNvramConfig_match', '0xa3d4L')< / span > < br > < span class = "line" > XrefsTo nvram-match func addr: 0xc940L< / span > < br > < span class = "line" > nvram key: qos_bw_set_sel< / span > < br > < span class = "line" > nvram value: 1< / span > < br > < span class = "line" > XrefsTo nvram-match func addr: 0xc9b4L< / span > < br > < span class = "line" > nvram key: qos_bw_enable< / span > < br > < span class = "line" > nvram value: 1< / span > < br > < span class = "line" > XrefsTo nvram-match func addr: 0xfbd0L< / span > < br > < span class = "line" > nvram key: wlg_band< / span > < br > < span class = "line" > nvram value: 2.4G< / span > < br > < span class = "line" > XrefsTo nvram-match func addr: 0xfc84L< / span > < br > < span class = "line" > nvram value: 5G< / span > < br > < span class = "line" > XrefsTo nvram-match func addr: 0xff70L< / span > < br > < span class = "line" > nvram key: wlg_band< / span > < br > < span class = "line" > nvram value: 2.4G< / span > < br > < span class = "line" > nvram value: static< / span > < br > < span class = "line" > XrefsTo nvram-match func addr: 0x13d2cL< / span > < br > < span class = "line" > nvram key: board_id< / span > < br > < span class = "line" > nvram value: U12H127T00_NETGEAR< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2021-01-08 08:35:03 +00:00
< h2 id = "NVRAM默认配置" > < a href = "#NVRAM默认配置" class = "headerlink" title = "NVRAM默认配置" > < / a > NVRAM默认配置< / h2 > < p > 如上所述, libnvram.so中data段存放着默认配置< br > < img src = "https://res.cloudinary.com/dozyfkbg3/image/upload/v1610094620/nvram/image_23.png" alt > < br > 利用IDApython获取该区域存放的键值, 注意: 该区域并不存放字符串, 而是存放“存放字符串地址处”的地址, 所以也要通过Doword来获取实际地址< / p >
2021-04-11 06:53:08 +00:00
< figure class = "highlight python" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "keyword" > import< / span > idautils< / span > < br > < span class = "line" > < span class = "keyword" > for< / span > seg < span class = "keyword" > in< / span > idautils.Segments():< / span > < br > < span class = "line" > < span class = "keyword" > if< / span > SegName(seg) == < span class = "string" > '.data'< / span > :< / span > < br > < span class = "line" > start = idc.SegStart(seg)< / span > < br > < span class = "line" > end = idc.SegEnd(seg)< / span > < br > < span class = "line" > < span class = "keyword" > print< / span > idc.SegName(seg),start,end< / span > < br > < span class = "line" > < span class = "keyword" > while< / span > (start!=end):< / span > < br > < span class = "line" > key = GetString(Dword(start))< / span > < br > < span class = "line" > < span class = "keyword" > if< / span > key != < span class = "literal" > None< / span > < span class = "keyword" > and< / span > key != < span class = "string" > '0'< / span > :< / span > < br > < span class = "line" > start += < span class = "number" > 4< / span > < / span > < br > < span class = "line" > val = GetString(Dword(start))< / span > < br > < span class = "line" > < span class = "keyword" > if< / span > < span class = "string" > 'upnp'< / span > < span class = "keyword" > in< / span > key:< / span > < br > < span class = "line" > print(< span class = "string" > '%s=%s'< / span > %(key,val))< / span > < br > < span class = "line" > start += < span class = "number" > 4< / span > < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2021-01-08 08:35:03 +00:00
< p > 这里我们只关注有upnp特征的键值对< / p >
2021-04-11 06:53:08 +00:00
< figure class = "highlight shell" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > .data [77868 94004](tel:7786894004)< / span > < br > < span class = "line" > upnp_enable=1< / span > < br > < span class = "line" > upnp_turn_on=1< / span > < br > < span class = "line" > upnp_advert_period=30< / span > < br > < span class = "line" > upnp_advert_ttl=4< / span > < br > < span class = "line" > upnp_portmap_entry=0< / span > < br > < span class = "line" > upnp_duration=3600< / span > < br > < span class = "line" > upnp_DHCPServerConfigurable=1< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2021-01-08 08:35:03 +00:00
< p > 另外再补充几个与网络有关的配置< / p >
2021-04-11 06:53:08 +00:00
< figure class = "highlight shell" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > friendly_name=Netgear< / span > < br > < span class = "line" > lan_hwaddr=AA:BB:CC:DD:EE:FF< / span > < br > < span class = "line" > lan_ipaddr=192.168.2.2< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2021-01-08 08:35:03 +00:00
< p > 使用这个配置成功仿真~< / p >
< h2 id = "一些IDApython使用方法" > < a href = "#一些IDApython使用方法" class = "headerlink" title = "一些IDApython使用方法" > < / a > 一些IDApython使用方法< / h2 > < p > 蒸米写的:< a href = "https://wooyun.js.org/drops/IDAPython%20%E8%AE%A9%E4%BD%A0%E7%9A%84%E7%94%9F%E6%B4%BB%E6%9B%B4%E6%BB%8B%E6%B6%A6%20part1%20and%20part2.html" target = "_blank" rel = "noopener" > https://wooyun.js.org/drops/IDAPython%20%E8%AE%A9%E4%BD%A0%E7%9A%84%E7%94%9F%E6%B4%BB%E6%9B%B4%E6%BB%8B%E6%B6%A6%20part1%20and%20part2.html< / a > < br > < a href = "https://cartermgj.github.io/2017/10/10/ida-python/" target = "_blank" rel = "noopener" > https://cartermgj.github.io/2017/10/10/ida-python/< / a > < br > < a href = "https://gitee.com/it-ebooks/it-ebooks-2018-04to07/raw/master/IDAPython%20%E5%88%9D%E5%AD%A6%E8%80%85%E6%8C%87%E5%8D%97.pdf" target = "_blank" rel = "noopener" > https://gitee.com/it-ebooks/it-ebooks-2018-04to07/raw/master/IDAPython%20%E5%88%9D%E5%AD%A6%E8%80%85%E6%8C%87%E5%8D%97.pdf< / a > < br > < a href = "https://www.0xaa55.com/thread-1586-1-1.html" target = "_blank" rel = "noopener" > https://www.0xaa55.com/thread-1586-1-1.html< / a > < br > < a href = "https://wizardforcel.gitbooks.io/grey-hat-python/content/43.html" target = "_blank" rel = "noopener" > https://wizardforcel.gitbooks.io/grey-hat-python/content/43.html< / a > < / p >
< / div >
< div >
< div style = "padding: 10px 0; margin: 20px auto; width: 90%; text-align: center;" >
< div > 您的支持将鼓励我继续创作!< / div >
< button id = "rewardButton" disable = "enable" onclick = "var qr = document.getElementById('QR'); if (qr.style.display === 'none') {qr.style.display='block';} else {qr.style.display='none'}" >
< span > 打赏< / span >
< / button >
< div id = "QR" style = "display: none;" >
< div id = "wechat" style = "display: inline-block" >
< img id = "wechat_qr" src = "/images/Wechatpay.png" alt = "Cool-Y 微信支付" >
< p > 微信支付< / p >
< / div >
< div id = "alipay" style = "display: inline-block" >
< img id = "alipay_qr" src = "/images/Alipay.png" alt = "Cool-Y 支付宝" >
< p > 支付宝< / p >
< / div >
< / div >
< / div >
< / div >
2021-04-10 12:03:10 +00:00
< div >
< ul class = "post-copyright" >
< li class = "post-copyright-author" >
< strong > 本文作者:< / strong >
Cool-Y
< / li >
< li class = "post-copyright-link" >
< strong > 本文链接:< / strong >
< a href = "https://cool-y.github.io/2021/01/08/nvram-config/" title = "自动化获取nvram配置" > https://cool-y.github.io/2021/01/08/nvram-config/< / a >
< / li >
< li class = "post-copyright-license" >
< strong > 版权声明: < / strong >
本博客所有文章除特别声明外,均采用 < a href = "https://creativecommons.org/licenses/by-nc-sa/3.0/" rel = "external nofollow" target = "_blank" > CC BY-NC-SA 3.0< / a > 许可协议。转载请注明出处!
< / li >
< / ul >
< / div >
2021-01-08 08:35:03 +00:00
< footer class = "post-footer" >
< div class = "post-tags" >
< a href = "/tags/UPnP/" rel = "tag" > # UPnP< / a >
< a href = "/tags/固件模拟/" rel = "tag" > # 固件模拟< / a >
2021-03-02 06:31:33 +00:00
< a href = "/tags/Netgear/" rel = "tag" > # Netgear< / a >
< a href = "/tags/NVRAM/" rel = "tag" > # NVRAM< / a >
2021-01-08 08:35:03 +00:00
< / div >
2021-04-10 19:19:48 +00:00
< div class = "post-widgets" >
< div id = "needsharebutton-postbottom" >
< span class = "btn" >
< i class = "fa fa-share-alt" aria-hidden = "true" > < / i >
< / span >
< / div >
< / div >
2021-01-08 08:35:03 +00:00
< div class = "post-nav" >
< div class = "post-nav-next post-nav-item" >
< a href = "/2021/01/08/Netgear-psv-2020-0211/" rel = "next" title = "Netgear_栈溢出漏洞_PSV-2020-0211" >
< i class = "fa fa-chevron-left" > < / i > Netgear_栈溢出漏洞_PSV-2020-0211
< / a >
< / div >
< span class = "post-nav-divider" > < / span >
< div class = "post-nav-prev post-nav-item" >
2021-03-02 06:31:33 +00:00
< a href = "/2021/03/02/DIR-802-OS-Command-Injection/" rel = "prev" title = "DIR-802 OS Command Injection" >
DIR-802 OS Command Injection < i class = "fa fa-chevron-right" > < / i >
< / a >
2021-01-08 08:35:03 +00:00
< / div >
< / div >
< / footer >
< / div >
< / article >
< div class = "post-spread" >
< / div >
< / div >
< / div >
2021-04-10 12:37:40 +00:00
< div class = "comments" id = "comments" >
< div id = "gitalk-container" > < / div >
< / div >
2021-01-08 08:35:03 +00:00
< / div >
< div class = "sidebar-toggle" >
< div class = "sidebar-toggle-line-wrap" >
< span class = "sidebar-toggle-line sidebar-toggle-line-first" > < / span >
< span class = "sidebar-toggle-line sidebar-toggle-line-middle" > < / span >
< span class = "sidebar-toggle-line sidebar-toggle-line-last" > < / span >
< / div >
< / div >
< aside id = "sidebar" class = "sidebar" >
2021-04-10 20:13:11 +00:00
< div id = "sidebar-dimmer" > < / div >
2021-01-08 08:35:03 +00:00
< div class = "sidebar-inner" >
< ul class = "sidebar-nav motion-element" >
< li class = "sidebar-nav-toc sidebar-nav-active" data-target = "post-toc-wrap" >
文章目录
< / li >
< li class = "sidebar-nav-overview" data-target = "site-overview-wrap" >
站点概览
< / li >
< / ul >
< section class = "site-overview-wrap sidebar-panel" >
< div class = "site-overview" >
< div class = "site-author motion-element" itemprop = "author" itemscope itemtype = "http://schema.org/Person" >
< img class = "site-author-image" itemprop = "image" src = "/images/avatar.png" alt = "Cool-Y" >
< p class = "site-author-name" itemprop = "name" > Cool-Y< / p >
2021-04-10 20:10:04 +00:00
< p class = "site-description motion-element" itemprop = "description" > Juice is temporary but Sauce is forever< / p >
2021-01-08 08:35:03 +00:00
< / div >
< nav class = "site-state motion-element" >
< div class = "site-state-item site-state-posts" >
< a href = "/archives/" >
2021-05-20 11:39:04 +00:00
< span class = "site-state-item-count" > 31< / span >
2021-01-08 08:35:03 +00:00
< span class = "site-state-item-name" > 日志< / span >
< / a >
< / div >
< div class = "site-state-item site-state-categories" >
< a href = "/categories/index.html" >
< span class = "site-state-item-count" > 7< / span >
< span class = "site-state-item-name" > 分类< / span >
< / a >
< / div >
< div class = "site-state-item site-state-tags" >
< a href = "/tags/index.html" >
2021-04-10 10:53:27 +00:00
< span class = "site-state-item-count" > 55< / span >
2021-01-08 08:35:03 +00:00
< span class = "site-state-item-name" > 标签< / span >
< / a >
< / div >
< / nav >
2021-04-11 06:53:08 +00:00
< div class = "feed-link motion-element" >
< a href = "/atom.xml" rel = "alternate" >
< i class = "fa fa-rss" > < / i >
RSS
< / a >
< / div >
2021-01-08 08:35:03 +00:00
< div class = "links-of-author motion-element" >
< span class = "links-of-author-item" >
< a href = "https://github.com/Cool-Y" target = "_blank" title = "GitHub" >
< i class = "fa fa-fw fa-github" > < / i > GitHub< / a >
< / span >
< span class = "links-of-author-item" >
< a href = "mailto:cool.yim@whu.edu.cn" target = "_blank" title = "E-Mail" >
< i class = "fa fa-fw fa-envelope" > < / i > E-Mail< / a >
< / span >
< span class = "links-of-author-item" >
< a href = "https://www.instagram.com/yan__han/" target = "_blank" title = "Instagram" >
< i class = "fa fa-fw fa-instagram" > < / i > Instagram< / a >
< / span >
< / div >
< div id = "music163player" >
2021-04-10 12:03:10 +00:00
< iframe frameborder = "no" border = "0" marginwidth = "0" marginheight = "0" width = "330" height = "110" src = "//music.163.com/outchain/player?type=4&id=334277093&auto=1&height=90" > < / iframe >
2021-01-08 08:35:03 +00:00
< / div >
< / div >
< / section >
<!-- noindex -->
< section class = "post-toc-wrap motion-element sidebar-panel sidebar-panel-active" >
< div class = "post-toc" >
< div class = "post-toc-content" > < ol class = "nav" > < li class = "nav-item nav-level-2" > < a class = "nav-link" href = "#match函数" > < span class = "nav-text" > match函数< / span > < / a > < / li > < li class = "nav-item nav-level-2" > < a class = "nav-link" href = "#NVRAM默认配置" > < span class = "nav-text" > NVRAM默认配置< / span > < / a > < / li > < li class = "nav-item nav-level-2" > < a class = "nav-link" href = "#一些IDApython使用方法" > < span class = "nav-text" > 一些IDApython使用方法< / span > < / a > < / li > < / ol > < / div >
< / div >
< / section >
<!-- /noindex -->
< / div >
< / aside >
< / div >
< / main >
< footer id = "footer" class = "footer" >
< div class = "footer-inner" >
< div class = "copyright" > © 2019 — < span itemprop = "copyrightYear" > 2021< / span >
< span class = "with-love" >
< i class = "fa fa-user" > < / i >
< / span >
< span class = "author" itemprop = "copyrightHolder" > Cool-Y< / span >
< span class = "post-meta-divider" > |< / span >
< span class = "post-meta-item-icon" >
< i class = "fa fa-area-chart" > < / i >
< / span >
2021-05-20 11:39:04 +00:00
< span title = "Site words total count" > 105.1k< / span >
2021-01-08 08:35:03 +00:00
< / div >
< div class = "powered-by" > 由 < a class = "theme-link" target = "_blank" href = "https://hexo.io" > Hexo< / a > 强力驱动< / div >
< div class = "busuanzi-count" >
< script async src = "//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" > < / script >
< span class = "site-uv" >
< i class = "fa fa-user" > < / i >
< span class = "busuanzi-value" id = "busuanzi_value_site_uv" > < / span >
< / span >
< span class = "site-pv" >
< i class = "fa fa-eye" > < / i >
< span class = "busuanzi-value" id = "busuanzi_value_site_pv" > < / span >
< / span >
< / div >
< / div >
< / footer >
< div class = "back-to-top" >
< i class = "fa fa-arrow-up" > < / i >
2021-04-10 19:19:48 +00:00
< span id = "scrollpercent" > < span > 0< / span > %< / span >
2021-01-08 08:35:03 +00:00
< / div >
2021-04-10 19:19:48 +00:00
< div id = "needsharebutton-float" >
< span class = "btn" >
< i class = "fa fa-share-alt" aria-hidden = "true" > < / i >
< / span >
< / div >
2021-01-08 08:35:03 +00:00
< / div >
< script type = "text/javascript" >
if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
window.Promise = null;
}
< / script >
< script type = "text/javascript" src = "/lib/jquery/index.js?v=2.1.3" > < / script >
< script type = "text/javascript" src = "/lib/fastclick/lib/fastclick.min.js?v=1.0.6" > < / script >
< script type = "text/javascript" src = "/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7" > < / script >
< script type = "text/javascript" src = "/lib/velocity/velocity.min.js?v=1.2.1" > < / script >
< script type = "text/javascript" src = "/lib/velocity/velocity.ui.min.js?v=1.2.1" > < / script >
< script type = "text/javascript" src = "/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5" > < / script >
< script type = "text/javascript" src = "/js/src/utils.js?v=5.1.4" > < / script >
< script type = "text/javascript" src = "/js/src/motion.js?v=5.1.4" > < / script >
< script type = "text/javascript" src = "/js/src/scrollspy.js?v=5.1.4" > < / script >
< script type = "text/javascript" src = "/js/src/post-details.js?v=5.1.4" > < / script >
< script type = "text/javascript" src = "/js/src/bootstrap.js?v=5.1.4" > < / script >
2021-04-10 12:37:40 +00:00
2021-04-10 12:40:26 +00:00
<!-- LOCAL: You can save these files to your site and update links -->
< link rel = "stylesheet" href = "https://unpkg.com/gitalk/dist/gitalk.css" >
< script src = "https://unpkg.com/gitalk/dist/gitalk.min.js" > < / script >
<!-- END LOCAL -->
< script type = "text/javascript" >
function renderGitalk(){
var gitalk = new Gitalk({
owner: 'Cool-Y',
repo: 'gitment-comments',
clientID: '180955a2c3ae3d966d9a',
clientSecret: '1c5db4da72df5e6fc318d12afe5f4406f7c54343',
admin: 'Cool-Y',
2021-04-10 12:47:46 +00:00
id: decodeURI(location.pathname),
2021-04-10 12:40:26 +00:00
distractionFreeMode: 'true'
});
gitalk.render('gitalk-container');
}
renderGitalk();
< / script >
2021-01-08 08:35:03 +00:00
< script src = "https://cdn1.lncld.net/static/js/av-core-mini-0.6.4.js" > < / script >
2021-05-21 07:35:38 +00:00
< script > AV . initialize ( "CnxMogaLcXQrm9Q03lF8XH7j-gzGzoHsz" , "EHqNuJ6AYvuHnY6bN6w2SMXl" ) ; < / script >
2021-01-08 08:35:03 +00:00
< script >
function showTime(Counter) {
var query = new AV.Query(Counter);
var entries = [];
var $visitors = $(".leancloud_visitors");
$visitors.each(function () {
entries.push( $(this).attr("id").trim() );
});
query.containedIn('url', entries);
query.find()
.done(function (results) {
var COUNT_CONTAINER_REF = '.leancloud-visitors-count';
if (results.length === 0) {
$visitors.find(COUNT_CONTAINER_REF).text(0);
return;
}
for (var i = 0; i < results.length ; i + + ) {
var item = results[i];
var url = item.get('url');
var time = item.get('time');
var element = document.getElementById(url);
$(element).find(COUNT_CONTAINER_REF).text(time);
}
for(var i = 0; i < entries.length ; i + + ) {
var url = entries[i];
var element = document.getElementById(url);
var countSpan = $(element).find(COUNT_CONTAINER_REF);
if( countSpan.text() == '') {
countSpan.text(0);
}
}
})
.fail(function (object, error) {
console.log("Error: " + error.code + " " + error.message);
});
}
function addCount(Counter) {
var $visitors = $(".leancloud_visitors");
var url = $visitors.attr('id').trim();
var title = $visitors.attr('data-flag-title').trim();
var query = new AV.Query(Counter);
query.equalTo("url", url);
query.find({
success: function(results) {
if (results.length > 0) {
var counter = results[0];
counter.fetchWhenSave(true);
counter.increment("time");
counter.save(null, {
success: function(counter) {
var $element = $(document.getElementById(url));
$element.find('.leancloud-visitors-count').text(counter.get('time'));
},
error: function(counter, error) {
console.log('Failed to save Visitor num, with error message: ' + error.message);
}
});
} else {
var newcounter = new Counter();
/* Set ACL */
var acl = new AV.ACL();
acl.setPublicReadAccess(true);
acl.setPublicWriteAccess(true);
newcounter.setACL(acl);
/* End Set ACL */
newcounter.set("title", title);
newcounter.set("url", url);
newcounter.set("time", 1);
newcounter.save(null, {
success: function(newcounter) {
var $element = $(document.getElementById(url));
$element.find('.leancloud-visitors-count').text(newcounter.get('time'));
},
error: function(newcounter, error) {
console.log('Failed to create');
}
});
}
},
error: function(error) {
console.log('Error:' + error.code + " " + error.message);
}
});
}
$(function() {
var Counter = AV.Object.extend("Counter");
if ($('.leancloud_visitors').length == 1) {
addCount(Counter);
} else if ($('.post-title-link').length > 1) {
showTime(Counter);
}
});
< / script >
< script >
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
< / script >
2021-04-10 19:19:48 +00:00
< link rel = "stylesheet" href = "/lib/needsharebutton/needsharebutton.css" >
2021-01-08 08:35:03 +00:00
2021-04-10 19:19:48 +00:00
< script src = "/lib/needsharebutton/needsharebutton.js" > < / script >
< script >
pbOptions = {};
pbOptions.iconStyle = "box";
pbOptions.boxForm = "horizontal";
pbOptions.position = "bottomCenter";
pbOptions.networks = "Weibo,Wechat,Douban,QQZone,Twitter,Facebook";
new needShareButton('#needsharebutton-postbottom', pbOptions);
flOptions = {};
flOptions.iconStyle = "box";
flOptions.boxForm = "horizontal";
flOptions.position = "middleRight";
flOptions.networks = "Weibo,Wechat,Douban,QQZone,Twitter,Facebook";
new needShareButton('#needsharebutton-float', flOptions);
< / script >
2021-01-08 08:35:03 +00:00
2021-04-10 19:19:48 +00:00
< script type = "text/javascript" src = "/js/src/js.cookie.js?v=5.1.4" > < / script >
< script type = "text/javascript" src = "/js/src/scroll-cookie.js?v=5.1.4" > < / script >
2021-01-08 08:35:03 +00:00
< / body >
< / html >