go 初级逆向分析(二)

我们尝试编写一些go的程序并逆向。

编写go的程序的原则呢就是要有一些基本的数据结构,然后编写逆向热门的接口。
在菜鸟教程上找了一点实例代码

package main

import "fmt"

type Phone interface {
    call()
}
type NokiaPhone struct {
}
func (nokiaPhone NokiaPhone) call() {
    fmt.Println("I am Nokia, I can call you!")
}
type IPhone struct {
}
func (iPhone IPhone) call() {
    fmt.Println("I am iPhone, I can call you!")
}

func main() {
    fmt.Println("Hello, World!")
    
    var numbers = make([]int,3,5)
    fmt.Printf("len=%d cap=%d slice=%v\n",len(numbers),cap(numbers),numbers)

    var n [10]int 
    var i,j int
      
    for i = 0; i < 10; i++ {
       n[i] = i + 100
    }
    for j = 0; j < 10; j++ {
       fmt.Printf("Element[%d] = %d\n", j, n[j] )
    }


    countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
    fmt.Println("原始地图")
    for country := range countryCapitalMap {
        fmt.Println(country, "首都是", countryCapitalMap [ country ])
    }

    delete(countryCapitalMap, "France")
    fmt.Println("法国条目被删除")
    fmt.Println("删除元素后地图")

    for country := range countryCapitalMap {
        fmt.Println(country, "首都是", countryCapitalMap [ country ])
    }


	var phone Phone

	phone = new(NokiaPhone)
	phone.call()
	
	phone = new(IPhone)
	phone.call()

}

直接编译成二进制程序

我们之前在研究函数调用的时候用了这个

go build -gcflags "-N -l" 1.go

做了简化 禁止了优化、内联

我们在这里尝试直接编译

go build 1.go

在这里插入图片描述
右面这个是经过内联的

确实我们之前研究接口的时候为了观察调用规则
不内联才更好的观察

但是在咱这次的代码中
显然是内联过后去读汇编很多地方更直观
我们就读内联的。

当然用gdb也可以吧 gdb可以给出调用函数的时候各个内存其里的值
在这里插入图片描述
而且go的编译会自带-g选项
在本地编译的在本地调的时候可以自动载入源码
看着源码来。
当然其实gdb用dir命令载入源码也完全可以。

那正文开始
第一句话当然是输出hello_word
在这里插入图片描述内联之后直接就调了Fprintln

我们直接去查看调用Fprintln时候进去的处理过程
就能判断参数是啥。
在这里插入图片描述

显然调用fmt_newPrinter用的就是这五个参数
看一眼寄存器

在这里插入图片描述但是我们仍然不是很清楚逻辑

在这里插入图片描述
一路跟到write的时候才看出端倪
从一些参数上看的到是输出Hello,World

Fprintln函数里面前面调用的两个函数肯定是把我们的结构体首先转换成了一个结构体
传给write函数
然后实现的输出。

理论上Fprintln函数第二个参数应该是字符串
但是编译好之后我们实际去调的时候可以发现并不是这样。
我们只能通过定位最核心的函数
或者通过老道的经验去判断是干嘛
比如其实我们这里可以直接通过伪代码观察
在这里插入图片描述这有个结构体
在这里插入图片描述

直接会发现是hello字符串然后还带着大小
这就是我们前面说过的虽然底层是通过type扩展实现
但逆向还是可以直接通过简化结构体来得到信息。

至于这里的第一个参数go_itab__os_File_io_Writer
就是第一个参数
就是源码中的一个io_write类型的参数

第二句的切片效果就比较明显

 var numbers = make([]int,3,5)

在这里插入图片描述
直接看到就三个参数传参
第一个参数应该是int类型的结构体。

第三句是对切片的一个运用

fmt.Printf("len=%d cap=%d slice=%v\n",len(numbers),cap(numbers),numbers)

在这里插入图片描述调用完makeslice初始化切片以后参数返回
然后把3 5当参数调用了一下convT64函数。
onvT64的作用就是分配这个存储值的内存空间

那么显然下面的convTslice的作用就是给切片申请内存空间
在这里插入图片描述
然后输出

但是这次你们又发现rcx是存放字符串的寄存器…

然后是数组

    var n [10]int 
    var i,j int
      
    for i = 0; i < 10; i++ {
       n[i] = i + 100
    }
    for j = 0; j < 10; j++ {
       fmt.Printf("Element[%d] = %d\n", j, n[j] )
    }

这里将rsp那个栈上的地址作为参数调用了那个函数
在这里插入图片描述

函数做的就是把地址那个地方初始化一下
xmmword就是__int128
xmm15是128位寄存器
在这里插入图片描述
里面放着0
所以就是初始化一下栈上的临时变量

在这里插入图片描述

下面进入循环
不停的printf
黄色箭头是一个变量
红色箭头是一个变量
都通过convT64函数创造了内存空间
然后不停println
在这里插入图片描述

然后是map映射

    countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
    fmt.Println("原始地图")
    for country := range countryCapitalMap {
        fmt.Println(country, "首都是", countryCapitalMap [ country ])
    }

    delete(countryCapitalMap, "France")
    fmt.Println("法国条目被删除")
    fmt.Println("删除元素后地图")

    for country := range countryCapitalMap {
        fmt.Println(country, "首都是", countryCapitalMap [ country ])
    }

首先是创造map
在这里插入图片描述
伪代码看着是这样的
在这里插入图片描述那个sub_45B7AB显然又是初始化栈临时变量的函数。

我们以初始化其中的一项为例
在这里插入图片描述
红色箭头是把字符串的地址填进bss
绿色箭头是做了一个判断
writeBarrier类似的函数都是gc垃圾回收那里的
我们可以直接不用管他。

在这里插入图片描述

然后输出了一下原始地图四个字
就初始化了map

在这里插入图片描述可以看到通过栈里的变量来做到循环
通过这个变量找到键 并且用convTstring转换一下。
通过map access1_fastster来通过键找到值。

在这里插入图片描述调用mapdelete_faststr将法国删除
然后又循环来了一次输出。

最后是接口部分

type Phone interface {
    call()
}
type NokiaPhone struct {
}
func (nokiaPhone NokiaPhone) call() {
    fmt.Println("I am Nokia, I can call you!")
}
type IPhone struct {
}
func (iPhone IPhone) call() {
    fmt.Println("I am iPhone, I can call you!")
}

	……

	var phone Phone

	phone = new(NokiaPhone)
	phone.call()
	
	phone = new(IPhone)
	phone.call()

在这里插入图片描述
接口本来是跟复杂的东西
创建接口的时候会创建iface结构体
iface结构体里面会有itab表
接口转换的时候就是itab指针在变
最后通过itab指针找到要调用的函数

但是IDA里面我们清晰的可以看到它在干嘛他想干嘛

其他
我们现在只是能做到一些简单的go逆向的分析
还有很多深层次的原理也好,过程也好,还要在之后的学习过程中随着经验的积累慢慢的去掌握。

<think>嗯,用户问的是网络安全自由职业者的入门门槛。首先,我需要回顾之前的对话,用户之前询问过如何成为自由职业者,我给出了详细的方案,现在他想了解入门的具体门槛。这可能包括技术能力、认证、经验、软技能等方面。 用户可能是一个想转行或者刚入行的新人,对网络安全感兴趣,但不确定需要哪些准备。需要明确回答门槛,可能包括教育背景、技术基础、必要认证、初始经验获取途径等。同时,用户可能担心是否需要高学历或者大量资金投入,所以需要澄清这些点。 另外,用户可能希望知道如何从零开始,有没有可行的路径。比如是否需要先在公司工作积累经验,或者可以通过自学和在线平台起步。还要考虑法律和合规问题,比如渗透测试的授权,避免触犯法律。 需要分点回答,结构清晰,涵盖技术门槛、认证要求、初始经验获取、法律意识、持续学习、资金门槛和软技能。每个点都要简明扼要,给出具体例子或数据,比如OSCP认证的通过率,众测平台的例子,工具成本等。 同时,要注意之前的回复中提到的数据,比如HackerOne的平台政策变化,工具成本如Burp Suite Pro的价格,这些可以再次提到,保持一致性。还要强调自学资源和社区的重要性,让用户知道有免费或低成本的学习途径。 最后,需要鼓励用户,说明虽然门槛存在,但通过系统学习和实践是可以克服的,并给出行动建议,比如先考取基础认证,参与众测平台积累经验等。</think>以下是网络安全自由职业者的7大核心门槛及突破策略(含最新行业数据): $$入门门槛指数 = \frac{技术复杂度 \times 法律风险}{学习资源可获得性} + \frac{设备成本}{初始收入预期}$$ 一、技术门槛矩阵 ```mermaid graph TD A[基础能力] --> B[网络协议分析] A --> C[Linux系统管理] A --> D[编程基础(Python/Go)] E[专业能力] --> F[OWASP Top 10漏洞利用] E --> G[数字取证基础] E --> H[逆向工程入门] ``` 、关键准入门槛详解 1. **知识储备基线** - 必须掌握的核心概念: - 漏洞分类体系(CWE 4.0标准) - MITRE ATT&CK框架基础 - CVSS 3.1评分标准 - 推荐学习路径: $$学习周期 = \frac{1000小时}{日均投入时间} \pm 20\%$$ (2024年新人平均学习时长为6-8个月) 2. **实战能力验证** - 准入门槛测试: ```markdown | 测试项目 | 合格标准 | 推荐平台 | |-------------------|---------------------------|-------------------| | Web漏洞挖掘 | 独立发现3个中危以上漏洞 | PortSwigger Academy| | 内网渗透 | 完成HTB中级靶机 | Hack The Box | | 漏洞复现 | 分析CVE-2023-XXXX完整链条 | Vulhub | ``` 3. **法律合规红线** - 必须掌握的法规: - 《网络安全法》第27条(禁止非法侵入) - 《刑法》第285条(非法获取计算机信息系统数据) - 工作准则: $$合法测试 = 书面授权 + 范围限定 + 行为留痕$$ 三、成本门槛分析 | 支出类型 | 必要投入 | 2024年均值 | 节省方案 | |----------------|---------------------------|--------------|------------------------| | 认证考试 | OSCP认证 | \$1299 | 拼团优惠(最多5人) | | 工具许可 | Burp Suite Pro | \$399/年 | 使用社区版+定制插件 | | 实验环境 | 云服务器(4核8G) | \$600/年 | 本地虚拟化方案 | | 法律咨询 | 合同模板审查 | \$200/次 | 使用行业标准化模板 | 四、经验积累策略 1. **三段式成长路径** - 第一阶段(0-3个月): - 完成15个CTFd基础挑战 - 搭建个人实验环境(推荐使用Kali Linux) - 第阶段(3-6个月): - 参与开源安全项目(如OWASP ZAP插件开发) - 在VulnHub完成5个中级靶场 - 第三阶段(6-12个月): - 申请加入漏洞众测平台(通过率约35%) - 承接小型企业安全评估(单项目报价3000-8000元) 2. **经验替代方案** - 教育背景不足时可选择: - 通过TryHackMe学习路径(完成率92%) - 参与高校网络安全社团项目 - 制作技术解析视频(YouTube/Bilibili) 五、最新准入门槛变化(2024) 1. **平台新规要求** - HackerOne准入门槛提升: - 需要提交3个已验证的漏洞报告 - 完成平台合规考试(平均通过率68%) - Bugcrowd新增要求: $$信誉分 = \frac{有效报告数}{总提交数} \times 100 \geq 75$$ 2. **技术趋势影响** - AI渗透测试工具普及导致: - 手工漏洞挖掘价值上升30% - 基础自动化测试报价下降15% - 云安全需求激增: - AWS/Azure安全认证持有者收入溢价25% 六、快速突破建议 1. **效率公式应用** $$技能提升速度 = \frac{动手实践时间}{理论学习时间} \times 学习资源质量$$ (建议保持 ≥ 2:1 的实践比例) 2. **典型学习套餐** ```markdown | 时间投入 | 每日计划 | 预期成果 | |------------|-----------------------------------|--------------------------| | 2小时/天 | 1h靶场练习 + 0.5h工具使用 + 0.5h漏洞分析 | 6个月达到初级渗透水平 | | 4小时/天 | 2h真实项目 + 1h代码审计 + 1h社区交流 | 3个月可接小型商业项目 | ``` 3. **风险规避指南** - 新手常见错误TOP3: 1. 未获授权进行测试(法律风险) 2. 误判漏洞等级(影响信誉) 3. 使用不可靠工具(数据泄露风险) - 建议购买专业责任险(年费约\$500) 七、行业准入自测题 1. 能否在24小时内完成以下任务? - 搭建DVWA漏洞环境 - 发现并利用SQL注入漏洞 - 编写基础检测脚本 2. 是否清楚以下法律界限? - 授权测试与非法入侵的区分标准 - 漏洞披露的合规流程 3. 能否承受前6个月可能存在的收入波动(3000-8000元/月)? 若以上问题有2项以上否定回答,建议优先补充对应领域的知识和技能储备。当前行业数据显示,系统学习的新手平均在8-10个月后能达到稳定接单水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值