pwn入门感受

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

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


他是想让你来计算给出的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库中有readlinesendline函数(有很多读写函数,可以在官方文档上看)
分析给出的信息段,从 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如下:

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