get_started_3dsctf_2016 1
拿到题目,依旧还是老样子,查看程序开启的保护和位数
可以看到程序开启了nx保护是32位程序,于是我们把程序放入ida32编译一下
一打开就能看到非常明显的get_flag这个程序,f5观察伪代码
当a1和a1都等于相应的值后就可以获取到flag,再查看main函数
gets存在明显的栈溢出
我刚开始想的是直接在ret处用 v2 = fopen("flag.txt", "rt")的地址覆盖,后来发现远程链接不能获取到flag,所以只好用别的办法
观察汇编代码可以看到,程序将308cd64fh和195719d1h处的值进行比较,所以这俩个地址就是a1和a2的值所以我们可以在ret函数用get_flag的地址覆盖,然后传递上这俩个参数也可以获得flag
完整的exp如下:
注意:0x0804e6a0是程序exit的地址,只有程序能够正常退出才能正确的回显flag(远程感谢一下get_started_3dsctf_2016 - 不会修电脑 - 博客园 (cnblogs.com))
还有第三种方法是通过mprotect函数赋给权限,不过我暂时并未尝试(还是我又菜又懒....)
结束