ciscn_2019_c_1 1
步骤:
先checksec,看一下开启了什么保护
可以看到开启了nx保护,然后把程序放入ida里面,观察程序代码
先shift+f12观察是否有system和binsh函数
发现没有system和binsh函数,所以我们考虑可以用libc泄露来做这道题
进入程序得主界面
在进入encrypt程序中按f5查看伪c代码
我们可以看到程序对输入得大小写和字符等进行了一个简单的加密,
注意if(v0>=strlen(s))可以跳出这个if循环
而strlen()函数的特性时读取到\0时会结束所以我们可以payload前以\0开头,从而绕过if加密
接下来我们判断需要溢出的字符数量
可以看到需要88个字符可以造成溢出,而\0站一个字符所以我们在加上87个a就可以造成溢出
由此构建我们的exp
完整exp如下
注意:在第一个payload中我们需要让程序获得libc后能继续返回到程序初,所以我们将返回地址设为了mian的地址
在第二个payload中,该程序在unbantu中的64位程序,所以我们还需要一个ret_addr来让payload保持栈对齐
本地和远程所获得的libc版本是不一样的,当本地失败后,远程试一下
成功获得 flag