《入侵的艺术》读书心得:第一章:赌场黑客轻取百万美金

第一章:赌场黑客轻取百万美金

一.故事经过:

20世纪90年代 Alex及他的三位技术大牛朋友过着慵懒和乏味的生活,于是他们决定去赌场寻找一些刺激…如何用技术去变现让他们赢的更多获得更大的成就感成为他们破解“老虎机”并入侵赌场的原动力。

Alex一行四人各怀绝技,分工协作:购买老虎机->拆解老虎机->提取二进制程序->逆行分析汇编代码;等一些列分析、研究的过程,让他们找到了老虎机洗牌、发牌等核心工作流程中的脆弱性:不安全的随机数算法。

不安全的随机数生成算法,使得Alex他们能够预测下一个随机数,即能帮忙预测到他们想要的牌面如:同花顺何时到来,这样就让赌博变为稳赢不赔的买卖。

Alex利用这样的漏洞,入侵赌场,相互协作让他们赚的彭满钵满。同时不忘优化入侵流程。将需要“打电话”沟通当前随机数位置这样的繁琐操作,逐步工具化进一步让他们的利益扩大化。

贪婪最终使得他们的行为暴露,但4位黑客身上的品质和成事的经历给了作为安全从业人员有着不小的启示。

二.故事涉及的安全知识点:

Donald Kunth 的伪随机数算法的脆弱性:

该伪随机数生成器并不能真正产生随机数。相反它仅仅是将一串数字任意的排好序。这里可能是 2的32次方,即40亿个数。随机数算法生成数字时是从数据列表中任意一个位置开始,依次取列表中的数据。因此是可预测的。

(不可预测性,是当前密码学算法的基本要求)

三.故事的启发:

a.犯罪动机与安全风险:

黑客的犯罪动机无非两种:经济利益或装B ,系统的的攻击面往往大于你所能投入的安全治理资源。那么从黑客的视角出发,重点关注与“钱”相关的业务是合理的。作为渗透或蓝军相关工作的同学,持续为自己找到前进的动力也非常重要。

比如持续SRC挖掘高价值漏洞,赢取死工资之外的奖励就是持续学习的很高的内驱力来源。

b.渗透测试团队的建设:

渗透测试是一个对于技术深度、广度要求都比较高的工作。测试团队的建设应该遵循团队木桶效应,即各怀绝技但团队无短板的原则。文章中:Mike:擅长硬件;Alex擅长密码学;Larry擅长组织;Macro擅长程序。这才是的4人团队在入侵中大获全胜。

c.工程师的坚韧与执着:

购买老虎机->拆解老虎机->提取二进制程序->逆行分析汇编代码;等一些列分析、研究的过程,在当时互联网还不够发达、程序分析工具匮乏的年代是相当不易的、图书馆查阅资料、晦涩难懂的汇编逐步抽丝剥茧分析出程序的核心脆弱性是相当有韧性的。

有了成稳定的赌场分工与协作技术和流程之后,他们还不忘迭代和优化,逐步将一些繁杂的“打电话”的流程进行优化、工具化这种“不满足”的精神十分难能可贵。

d.测试人员的思维和心理学:

《软件测试的艺术》这边书中第一次提到“测试心理学”这样的一个概念;如果你认为这个系统是健壮的、优秀的你多半无法发现Bug或漏洞;反之你坚信这个系统必然是存在缺陷的,你会积极的去思考可能存在问题的场景或者测试数据并付之于行动。结果自然也决然不同

文中Alex对于老虎机存在不安全伪随机数算法的大胆猜测,并不断的编写代码进行测试,并最终获得成功。正好印证了“测试心理学”的重要性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python代码示例,演示了如何使用蒙特卡罗模拟实现近似动态规划。 假设我们要解决赌场游戏的问题:有一个6面的骰子,每次投掷后可以选择停止或继续投掷。如果在某次投掷中出现了1,则整个游戏结束,并失去所有赌注。如果在某次投掷中出现了2到6,则可以选择继续投掷或停止,每次继续投掷将会获得相应的奖金,但同时也有一定概率失去所有赌注。我们的目标是找到一个最优的策略,以最大化我们在游戏中获得的奖金。 我们可以使用蒙特卡罗模拟来模拟游戏过程,并使用动态规划来学习最优策略。具体而言,我们可以使用一个价值函数来表示每个状态的价值,然后使用贝尔曼方程来更新这些价值。在每次模拟中,我们可以使用贪心策略来选择下一步的行动,并根据游戏结果来更新状态的价值。 下面是代码示例: ```python import random # 定义游戏规则 def roll_dice(): return random.randint(1, 6) def play_game(strategy): money = 10 while True: roll = roll_dice() if roll == 1: return 0 elif roll >= 2 and roll <= 6: if strategy(money, roll): money += roll else: return money else: raise ValueError("Invalid roll: {}".format(roll)) # 定义策略 def stop_strategy(money, roll): return True def greedy_strategy(money, roll): return roll > 2 # 使用蒙特卡罗模拟来更新状态价值 def update_value(strategy, values, n_simulations): for i in range(n_simulations): state = 10 while True: roll = roll_dice() if roll == 1: values[state] += strategy(state, roll) * (-state) break elif roll >= 2 and roll <= 6: if strategy(state, roll): state += roll else: values[state] += (1 - strategy(state, roll)) * state break # 使用动态规划来学习最优策略 def learn_strategy(values): optimal_strategy = [False] * 11 for state in range(1, 11): max_value = 0 for roll in range(2, 7): value = roll + values[min(state + roll, 10)] if value > max_value: max_value = value optimal_strategy[state] = True values[state] = max_value return optimal_strategy # 测试代码 values = [0] * 11 for i in range(100): update_value(greedy_strategy, values, 1000) optimal_strategy = learn_strategy(values) print("Optimal strategy:", optimal_strategy) ``` 在上面的代码中,我们定义了两个策略:stop_strategy 表示在任何情况下都停止投掷骰子,greedy_strategy 表示只有在骰子点数大于2时才继续投掷。然后我们使用蒙特卡罗模拟来更新每个状态的价值,并使用动态规划来学习最优策略。最后我们输出了学习到的最优策略。 需要注意的是,这只是一个简单的示例,实际应用中可能需要更复杂的模型和算法来解决更具挑战性的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值