本人也是一个pwn的小白,不足的地方请大家见谅,可以在评论区发一下我的错误。谢谢各位师傅。
1.checksec
那道题咱们先checksec一下
一看,这个是64位的,所以用IDA64。
再看一下,发现开启了NX保护。
由于本人也是一个小白,为了使更多的小白可以看懂,咱就再复习一下RELRO,STACK,NX,PIE到底能说明什么吧。
NX:数据执行防护 ,它会使栈上的数据没有执行的权力。主要防止:栈溢出 + 跳到栈上执行shellcode
RELRO:堆栈地址随机化。主要防止:所有需要用到堆栈精确地址的攻击,要想成功,
必须用提前泄露地址
PIE:代码地址随机化。主要防止:构造ROP链攻击
STACK:NO canary found:意思就是未发现栈保护
2.看ida
我就讲细致一些吧!其实这道题也挺简单的。
先看main函数
本小白细致的瞧了瞧,发现了一个read函数,心里一想,read不是个危险函数嘛,这个该不会就是一个栈溢出,用ret2text就可以解决吧!
紧接着按shift键+f12
有bin/sh
那就可以用ret2text做了,哎呀妈呀真香!
你们应该会查bin/sh的地址吧,真害怕你们不会查了,如果不会查,我就勉为其难的和你们说一说。先shift键+f12,看见了/bin/sh双击,然后你们会进入这个页面
然后点一下command,再点一下x键,弹出一个窗口,点击ok就可以,再按一下空格键,你就可以看到香喷喷的/bin/sh地址了。
bin/sh/地址是多少了,让我瞧瞧,0x4006EA 。
咱们接着看偏移量。
read(0, buf, (unsigned int)nbytes);nbytes这个是可以输入的最大字节数。
咱再点一下buf,看看buf允许输入的是多少。
偏移量是0x10+8,我相信大家应该是懂得吧!这个我就不说了
还有为了跳转到read函数,你还需要给scanf函数里面输入一些东西,我建议输入个大于等于24的数字,这样可以造成栈溢出。但是不要超过nbytes的字节数。
3.写exp
from pwn import*
#p=process('./ctf')
p=remote('node4.buuoj.cn',25952)
p.sendlineafter(b'Please input the length of your name:\n',b'30')
payload=b'a'*(0x10+0x8)+p64(0x04006EA)
p.sendline(payload)
p.interactive()