buuctf-pwn最基础题wp
test_your_nc
如题,nc连上就有flag了
要注意的就是端口号前面的冒号要改成空格
rip
用ubuntu的gdb打开
gdb ./pwn1
然后再输入checksec看看开了什么保护
基本都disabled,没事了
使用pattern create 150创建150个字符
输入r运行
这里出现了一个意外,run不了,提示:权限不够。给这个文件chmod 777一下就好了,这是buuctf上面的问题。
我们把刚刚创建的150复制到这里
然后我们输入x/wx $rsp查看此时rsp在哪
然后pattern offset 0x41412841查看偏移量
偏移量是23,就是23个a了,不需要加上64位的8或者32位的4
偏移量知道了,现在用ida64打开找/bin/sh
shift+F12
看到/bin/sh
在左边找到fun()函数,看一下地址,是0x401186
这样就可以写exp了,如果想用ida算偏移量也行,如下
看main函数
这里有gets函数
我们看上面s的定义[rbp-Fh]
F就是十六进制,就是10进制的15
加上64位的8
就是23,就是23个a
可以写exp了
这里题目出了一点问题
1 |
|
本来这样就行了,但是还是获取不到shell,然后查了资料才知道,这个远程的程序和本地这个有点不一样
连接之后我们要先输入一段字符之后它才提示要我们输入
就是说我们输入aaaa之后,后面全部是它打印出来的,所以就是它的输入点提前了
解决办法就是ret+1
就把0x401186改成0x401187就可以了
这里发现代码只能写在一个py文件里面这样才能跑出来,试了pycharm不能跑,不知道为什么
这里我还尝试用mac跑,但是因为mac上面在python3上安装了pwntools,在python2很难装,所以就试一下在python3上跑这个代码
但是在python3中对字符串相加增加了要求,所以会在p64()这里报错,说类型不匹配
直接加str()强制类型转换还是不行,网上找到一种方法对它进行编码成功,代码如下
1 |
|
不过最好还是在ubuntu上面跑好一点,因为一般跑pwntools都是在python2上面的
warmup_csaw_2016
丢ida里面
看到binsh
地址是
看main函数
有gets,看到v5,然后在最前面的定义里看,[rbp-40h]
那就是0x40,就是4*16=64,加上8就是72
1 |
|
这题用gdb看偏移量的话也很简单
用x/wx $rsp查看当前的rsp在哪,再查看偏移量,这里看到刚好是72
pwn1_sctf_2016
看main函数,找到了fgets()但是这里的s的空间是3c,而输入的只能有32,意思是我们输入32个字符串,根本无法溢出到3c就是3*16+12=60
(只接受输入 32 字节的内容后而栈的大小总共 0x3c 也就是 60 个字节,再加上 ebp 要填充 64 个字节才能覆盖返回地址)
那么怎么办,我们看下面的代码,这里有一个you和I
我们尝试运行一下程序看有什么名堂
我们发现输入I的时候会自动变成you
这样的话我们就可以做到输入少的内容,实际产生多的内容了,比如20个I就相当于20个you就是60个字符
然后我们找bin/sh
看地址
1 |
|
这里解释一下payload就是说先输入20个I,就会转成20个you就是60个字符了,然后加上32位程序的4个字符(checksec可以看到是32位程序),我们就随便加上4个b,这样就是64个字符覆盖到返回地址了,然后加上bin/sh就可以了
ciscn_2019_n_1
查到是64位程序,ida64打开
这里有flag
这个func()函数里面有问题
有gets()函数,下面是,如果v2=11.28125就会返回flag
这里的话有两种方法,第一张很简单就是根据gets()进行栈溢出,v1是30h就是48加上64位程序的8就是56,然后找cat /flag的地址
直接点进去到这里,但是这个地址是不对的,左边这个.rodata就很奇怪
后来发现直接把鼠标点在之前那个cat /flag上面就行了
下面这里就是地址了0x4006BE
或者右键Jump to xref…
本来的话点击ok就会跳转,但是不知道为什么跳不了
手动找一下
就在这里了也是0x4006BE这里左边的.text就对了
然后写exp
1 |
|
(这题的偏移量也可以用gdb查出来,不演示了,前几题都演示过了)
接下来看第二种方法,思路是找到 11.28125 的值是多少,然后把 v2 给改掉,v2 在 rsp+2c 的地方,所以要填上 2c 的字节占空
http://lostphp.com/hexconvert/
用这个网站进行浮点数的进制转换
1 |
|
jarvisoj_level0
用ida64打开
看上去很简单的hello world
看一下vulnerable_function()函数
是read()函数的栈溢出了
buf大小是0x80H,但是read可读取0x200
偏移量的话就是8*16+8=136
再看看/bin/sh在哪
/bin/sh没难度
是0x400596
如果用gdb查偏移量的话就是这样,也是136
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!