【淘汰】学pwn自闭记0x0000

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值