# pwn入门感受

**URL:** <https://forum.90sec.com/t/topic/2314>\
**Category:** 账号审核\
**Created:** [2023 年9 月 19 日 13:50 UTC](https://forum.90sec.com/t/topic/2314 "2023-09-19T13:50:50Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![GUANZHI](https://forum.90sec.com/letter_avatar_proxy/v4/letter/g/ec9cab/32.png) [@GUANZHI](https://forum.90sec.com/u/GUANZHI)\
发布日期： [2023 年9 月 19 日 13:50 UTC](https://forum.90sec.com/t/topic/2314/1 "2023-09-19T13:50:50Z")

</div>

# 初学pwn的一步一步解题学习的思路

```
Pwn主要学习语言会用到C语言和python语言，C用于读代码，python用于写脚本(exp)。
首先先用nc（netcat）访问IP地址和端口，得到如下的信息：

```

 ![image](https://forum.90sec.com/uploads/default/original/2X/d/ddc95bfd6765c10ef4b07f16be9c551064a9bb1e.png)  
他是想让你来计算给出的100道题计算结果是否正确，文件没有源代码，所以初步判定这道题属于_ **Blind Pwn** _类型，具体可以看这个链接 **CTF Blind pwn题型学习笔记** ，以了解Blind Pwn的相关知识。  
开始有个很矛盾的地方，就是不知道盲打有很多相应的攻击方式，不知道用哪一种，就在网上搜索都试一试，但是没有一个行得通，就想到之前打ciscn时有一道类似的web题，就是写脚本暴力破解得到flag。  
接下来就开始尝试写代码，首先要用到pwntools，这是python的第三方库（支持python2与python3），在网上可以找相应的下载方式，可以在ubuntu和Windows上使用（Windows上下载使用有点玄学，得看运气）。首先建立连接这里是远程连接就用

> from pwn import \*  
> sh = remote("IP addr",port) //本地程勋就用sh = process("./程序名")

pwntools库中有 **readline** ， **sendline** 函数（有很多读写函数，可以在官方文档上看）  
分析给出的信息段，从 **Welcome......** 到 **Now.. start** 一共有7行，就用了7个readline函数，之后是有规律的出现三行，前两行给出两个加数，第三行给出计算的结果，一共有100道题。使用循环语句：

> for i in range(100)：  
> sh.readline()  
> sh.readline()  
> //这两个函数就只是把信息接受到，不做任何处理，因为没啥用。接下来的是关键  
> s=sh.readline() //把第三行的计算公式给读下来，读出来的是_ **字符串** _

接下来用到split函数，先把“+”两边的分开，numbers[0]="762",numbers[1]="135=897",将numbers[0]转换为int类型

> numbers = s.split(b"+")  
> num0=int(numbers[0])

再将numbers[1]用split函数把“=”两边的分开，得到s[0]="135",s[1]="897",在强制转换为int类型

> s = numbers[1].split(b"=")  
> num1=int(s[0])  
> num2=int(s[1])

最后就是计算num0与num1的和与num2是否相等，根据相应要求发送对应字符串。

> if(num0+num1==num2):  
> sh.sendline(b'BlackBird')  
> print("BlackBird")  
> else:  
> sh.sendline(b'WingS')  
> print("WingS")

以上用到print函数只是为了更加清晰的看到这个过程。  
最后根据结果一步一步增加代码，最终exp如下：

```auto
from pwn import *
sh = remote("127.0.0.1",40626)
sh.readline()
sh.readline()
sh.readline()
sh.readline()
sh.readline()
sh.readline()
sh.readline()
for i in range(100):
    ss=sh.readline()
    print(ss)
    ss=sh.readline()
    print(ss)
    s = sh.readline()
    numbers = s.split(b"+")
    num0=int(numbers[0])
    s = numbers[1].split(b"=")
    num1=int(s[0])
    num2=int(s[1])
    if(num0+num1==num2):
        sh.sendline(b'BlackBird')
        print("BlackBird")
    else:
        sh.sendline(b'WingS')
        print("WingS")
s2=sh.read()
print(s2)
sh.interactive()

```

得到flag

 ![image](https://forum.90sec.com/uploads/default/original/2X/7/793aaa3ba63ebca4882bd0429f5e8ee76e5a1a07.png)
