bugku-pwn2

pwn2

首先我对pwn题完全没有了解,真萌新,所以就刷刷最基础的题目吧。
我是使用了pwndocker,第一次用没啥感觉。

docker exec -it mypwn /bin/bash
wget https://ctf.bugku.com/files/ad67ac41b68c70c40d90bce4a39796e4/pwn2
checksec pwn2

bugku-pwn2_第1张图片
这个东西我暂时看不懂,只知道这个pwn2是个64位程序
用IDA打开,找到main函数F5

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [rsp+0h] [rbp-30h]

  memset(&s, 0, 0x30uLL);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  puts("say something?");
  read(0, &s, 0x100uLL);
  puts("oh,that's so boring!");
  return 0;
}

伪代码
算了,看不懂,学汇编去了。

hh,学成归来
首先定义了一个变量

memset()函数原型是extern void *memset(void *buffer, int c, int count)buffer:为指针或是数组,c:是赋给buffer的值
也就是说这里的buffer(s)只能存入0x30个字节的数据,也就是48个字节,那么我们看到下面read函数读入了0x100个字节的数据,那么很明显这是一道栈溢出的题目。
bugku-pwn2_第2张图片

这里我们看到有个get_shell_函数
bugku-pwn2_第3张图片
他会直接cat flag,那么我们就使返回地址为get_shell_函数即可
说了这么多空话还是上手pwndbg来的实在
bugku-pwn2_第4张图片
在main函数打个断点之后run一下
next 单步步进
n乘以x次之后

好了再n一下就到了read函数了,也就是我们需要输入字符了,那么我们就老实一点输入48个字符
查看堆栈

可以看到rsi rsp这里是我们输入的字符离rbp有0x60-0x30=0x30个字节

而rbp+8为返回地址,所以我们需要创建0x30+0x8个垃圾字符,最后将返回值覆盖为get_shell_函数的地址,那么我们看看get_shell_函数的地址


好,那么开始构造exp:
bugku-pwn2_第5张图片
还是非常基础的,那么本题就到这里啦。如有写的不对的地方,还请多指教。

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