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函数赋给权限,不过我暂时并未尝试(还是我又菜又懒....)

结束

 

posted @ 2021-07-20 18:19  庄周恋蝶蝶恋花  阅读(285)  评论(0编辑  收藏  举报