[2021铁人赛 Day28] Binary Exploitation (Pwn) 介绍工具

  • 引言
    今天就来讨论 Pwn 吧,
    所谓 Binary Exploitation 直翻是二进制程序档渗透
    其实就是找寻程序中的漏洞,或是取得服务器权限,使用服务器 shell 偷取档案、修改资料等等。
    事实上这就是大家刻板印象中骇客所做的事情啦~

    那为什麽叫做 Pwn 呢?
    Pwn 念作「碰!」,就是一个拟声词,
    有那种攻破对方领地後,你对对方发出碰一声的声音调侃的感觉。/images/emoticon/emoticon50.gif
    [参考维基百科: Pwn]

    这主题的题目多半都是找程序漏洞、给你服务器你必许取得其 shell 控制权拿到某资料之类的。

  • pwntools
    pwntools 之前曾经提到过,现在我们正式要来使用它了。
    这个工具绝对是 CTF 必备,後面很多复杂的题目都离不开它,而且它很好用!

    首先我们先安装它:
    pwntools
    请照着教学中的步骤安装,如果你是 Python3 ,可以照着下面的步骤安装即可:

    $ apt-get update
    $ apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
    $ python3 -m pip install --upgrade pip
    $ python3 -m pip install --upgrade pwntools
    

    这里主要简介基本使用方式与常见函式,实际上还有非常多函数可以使用:

    from pwn import *
    r = remote('xxx.com', 12345)
    print(r.recvuntil(b'Ironman!\n').decode())
    r.sendline(b'go')
    print(r.recvline().decode())
    r.close()
    

    以这段程序码为例,我们假设一个情境:

    1. xxx.com 这个服务器的 port 12345 上,有个程序在执行
    2. 该程序会先 print 出:「I'm Ironman!」,然後换行
    3. 之後它会等待你 input
    4. 如果它收到 input 是 「go」
    5. 则它会 print 出 「success!」 然後换行
    6. 之後永远等待输入

    搭配这个情境,我们看看上面那段使用 pwntools 的程序:

    • 避免再混淆,先讲 decode()encode() ,只要是要传送或接收,一律都是 bytes 型态,给你看的时候要转成 str 型态。而 decode() 做的事是 bytes 变 str , encode() 做的事是 str 变 bytes ; 'xxx' 是 str 型态, b'yyy' 是 bytes 型态。这样就不会再搞混了!
    • from pwn import * 代表使用 pwntools ,也可以写 import pwn 但是等等所有 pwntools 的函式前面都要加上 pwn. 变成 pwn.函式() 的形式。
    • remote() 函式用来连接服务器,一样输入 host 与 port 就可以,连接成功将回传结果给 rr 可以在稍後跟服务器接收、传送资料等等,关闭服务器连接也要由 r 来做。
    • r 可以做的事简单说几个:
      • print(r.recvuntil(b'Ironman!\n').decode())
        recvuntil() 是从服务器接收输出,一直到括号里限定的内容为止,例如上面这句就是接收内容直到 Ironman! 然後换行为止,必须注意要是 bytes 型态,因此有个 b 。 接收到的结果使用 decode() 转回 str ,最後印出,因此这行会印出「I'm Ironman!」然後换行。
      • r.sendline(b'go')
        sendline() 就是送出资料给服务器,资料也必须是 bytes 型态,然後它会自动帮你加换行,因为是 sendline
      • print(r.recvline().decode())
        recvline() 则是从服务器接收一行输出,收到的一样是 bytes 型态,再自行转 str 印出。因为刚刚送出「go」给服务器,这里预期会收到「success!」。
      • r.close()
        关闭与服务器连结。

    大概最简单的使用方式就是这样,有遇到新的使用方法再陆续补充。


<<:  D29 / Jake 认为 Compose 不是 Compose? - Compose 是什麽

>>:  Day#28 上传照片(2)+Debug

【网路概论】 7-1 IPv4网路地址

基本格式 以32个二进位表示一个IP地址 当IP地址要以10进位表示时,会以8个二进位表示一数 进位...

[DAY-03] 有顶尖的同事 才有一流的工作环境

团队如果有一两个人能力仅免强胜任 会拉低团队所有人的表现. IF 你团队有五名优秀的下属 那这两个...

Day 1. 开场

前言: 在去年挑战了Hashicorp 0 到 0.003 介绍Hashicorp Consul, ...

React和DOM的那些事-节点更新

点击进入React源码调试仓库。 React的更新最终要落实到页面上,所以本文主要讲解DOM节点(H...

[Day 30] 最後一天了,来复习看看我们学了些什麽

今天是铁人赛的最後一天了,我们花点时间来看看这三十天我们都介绍了些什麽。 首先,我们介绍了一下 Ko...