攻防世界cgpwn2

首先checksec,之后放入IDA中

攻防世界cgpwn2_第1张图片
点进hello
攻防世界cgpwn2_第2张图片发现gets()函数可能会存在栈溢出,然后我们点进name
攻防世界cgpwn2_第3张图片发现 name 地址是固定的,那我们可以它写入 bin/sh ,接着看能不能找到system
攻防世界cgpwn2_第4张图片找到啦!所以这个题目的思路是:通过栈溢出漏洞,调用system函数,同时在name中写入"/bin/sh",把参数地址设置为name的首地址,就可以getshell了!
攻防世界cgpwn2_第5张图片

gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据,换句话说,如果输入的字符数目大于数组的长度,gets()无法检测到这个问题,就会发生内存越界。
先反编译,找到栈溢出漏洞的位置,在plt表中发现system()函数,但是没有‘/bin/sh’的影子,我们可以将/bin/sh传入name中,然后将其当作参数传入。实质是构造一个伪栈帧(必要的东西:函数地址,返回地址(随便写),参数地址)。要注意的是padding填充的时候,要根据程序是多少位的,来加上e(r)bp寄存器的栈中所占的字节数

攻防世界cgpwn2_第6张图片

你可能感兴趣的:(xctf,pwn)