printf(&s);
pwn搞了不知道多久都没搞定 一题,趋向自闭却永不自闭
首先想传递16进制的任意值过去就不能用简单的字符输入
因此使用python的pwntools的remote连接然后使用send相关函数将需要的字符以转义字符"\x00"的形式进行传输
–(转义字符的翻译,是由编译器进行的,因此不能直接向题目输入转义字符,题目中的处理编译器可不参与了!)
原本靠gdb调试观察堆栈内容,试图覆盖某函数的返回地址到getShell()但是莫名其妙的失败
目标地址在使用%hp输出时就是正确的目标地址,改为%hn后却失败了,???
好在有大哥提醒我,可以使用pwntools中的gdb模块调试,极好的
简单的使用process函数打开“./fsb”失败了
问题在于新打开了一个terminal,地址环境变了,所以gdb找不到:“./fsb”
好,那么想到两个方法:
1.将文件移动到根目录
2.网上查到的,可以利用context对象配置此时的terminal的环境变量
第二个方法如下(来自:http://brieflyx.me/2015/python-module/pwntools-advanced/):
s = process('./pwnme')
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
gdb.attach(proc.pidof(s)[0])
好,结果两个方法都失败了…不过发现gdb.debug可以直接打开文件,但是哪怕这样打开了,我也无法向文件发送我所需要的16进制值…
在看雪的帮助下发现了问题的本源,
https://bbs.pediy.com/thread-247347.htm
在attach的时候程序是会运行下去的,所以需要保证程序没有关闭,因此可以在attach后使用interactive函数,gdb就能正常读到程序了!
终于,我知道了怎么用pwntool调试程序…
好,那么继续,看看到底出了什么问题
首先说明我的思路,由于这道题的源程序中由getShell函数,所以只需要我使用printf(&s)漏洞将eip跳转到getShell就可以了,策略是使用格式化字符%n对堆栈的内容进行改写。具体我的选择是将作者自定义的一个大函数echo的返回地址覆盖为getShell的函数起始地址,该函数没有参数,因此这个题确实非常基础了,可我还是搞了好久!
gdb调试发现,目标地址已经成功存入eax,但是程序在:
mov word ptr [eax],bx
此处报错:SIGSEGV//段错误
emmm
?,我又发现了错误
问题在于esp和ebp,也就是堆栈的框架并不是固定的,在内存中的位置是随机的,也就是说,我之前所记录到的目标地址,是无效的
因此我对这个假的“目标地址”写内容,就有可能(我碰到的是全部)产生段错误
既然地址无法直接得到,那么我们至少可以先确认偏移地址,
在进入printf函数前,ebp-esp的值一定是固定的。
啊喂
直接使用%#xn难道不行吗,通过偏移来找到目标位置,然后写入需要的东西
yes!
这次应该可以成功了
–{fmtstr_payload函数:例子->fmtstr_payload(4,{a:b})//其中,4代表%4$n就是说第4个参数来到我们输入的payload,一般要通过自己测试才能确定这个偏移值
}
–{checksec函数:这个不是函数了,是一个工具,可以用来确定这个elf程序的安全措施,比如看能不能shellcode或者有没有开内存随机}
测试:
yes尼玛
%135$p的确可以直接输出那个返回地址,但是%n只能修改这个返回地址处的代码,而指向的地方main函数,根本不可写!!
行吧,我认了,可能我一开始的思路就是错的
覆盖返回地址可能没那么简单,那就看看能不能hijackGOT吧
checksec;发现堆栈没有执行权限,好的shellcode方法没了
没有启用内存随机化,那么GOT表可以一试
读取一下程序的got表
objdump -R xxx
获得和其中的got表,啊真实nice
记puts的got地址为puts_got
这不就结束了么?
使用payload将puts_got的内容修改为getshell的入口地址就好了…
以下为pwn脚本(所有6都是随便填充的):
from pwn import *
puts_got=0x66666666
getshell_addr=0x66666666
io=remote("6.6.6.6",6)
io.sendline(fmtstr_payload(4,{puts_got:getshell_addr}))
io.interactive()
已经getshell了;
另外附如何手写payload:
参考这篇文章,非常nice~
http://codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html