unexploitable Writeup[pwnable.tw]

0x00 unexploitable

最近在刷pwnable.tw(类似pwnable.kr,不过是台湾的)的题,看到了一个unexploitable的题目。根据题目描述:

The original challenge is on pwnable.kr and it is solvable. This time we fix the vulnerability and now we promise that the service is unexploitable.

下载下来后丢到ida看到确实没什么变化,除了pwnable.kr那个题中最重要的一点syscall没有给。

.text:0000000000400544 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:0000000000400544                 public main
.text:0000000000400544 main            proc near               ; DATA XREF: _start+1Do
.text:0000000000400544
.text:0000000000400544 buf             = byte ptr -10h
.text:0000000000400544
.text:0000000000400544                 push    rbp
.text:0000000000400545                 mov     rbp, rsp
.text:0000000000400548                 sub     rsp, 10h
.text:000000000040054C                 mov     edi, 3          ; seconds
.text:0000000000400551                 mov     eax, 0
.text:0000000000400556                 call    _sleep
.text:000000000040055B                 lea     rax, [rbp+buf]
.text:000000000040055F                 mov     edx, 100h       ; nbytes
.text:0000000000400564                 mov     rsi, rax        ; buf
.text:0000000000400567                 mov     edi, 0          ; fd
.text:000000000040056C                 mov     eax, 0
.text:0000000000400571                 call    _read
.text:0000000000400576                 leave
.text:0000000000400577                 retn
.text:0000000000400577 main            endp

0x01 思路

在pwnable.kr上这个题目用ROP和SROP均可以完成,不过有个重要个前提有syscall。这个题目删除了这个gadget,导致题目的难度上升了一个档次。pwnable.kr的writeup在http://weaponx.site/2017/02/28/unexploitable-Writeup-pwnable-kr/

题目给出了libc,看来是让我们用内存泄漏来计算出system/execve等地址来执行system("/bin/sh")。通常内存泄漏最终需要调用类似puts\write等打印函数,然而程序中并没有这些函数。只能通过syscallsyscall_id来调用需要的函数,但是又回到的最初没有syscall的情况。

所以只能寻求一个更有创造性的方法。

0x02 寻找syscall

在libc中搜索\x0f\x0fsyscall的机器码。可以看到在read函数中就有两个gadget。

gdb-peda$ find "\x0f\x05"
...
libc.so.6 : 0x7ffff7b0467e (<read+14>:  syscall)
libc.so.6 : 0x7ffff7b0469b (<read+43>:  syscall)
...
gdb-peda$ print read
$1 = {<text variable, no debug info>} 0x7ffff7b04670 <read>

可以发现read函数中的syscall的距离函数入口的偏移量只有14和43,根据ASLR的原理。可以通过修改GOT表中read函数的LSB(last significant bit,最低有效位)为0x7e或者0x9b就得到了syscall

0x03 how to exploit

第一段payload完成溢出,并调用read将第二段payload写入bss段中,然后利用pop rbp;retleave;ret将栈迁移到bss段上。

第二段payload完成修改GOT表中read的LSB,变为syscall。利用syscall调用write泄漏sleep的地址,计算出/bin/sh\x00的地址pop rdi;ret的地址和system的地址。最后将栈迁移到第三段payload上。

第三段payload,将/bin/sh\x00放入rdi寄存器中,完成system("/bin/sh\x00")

0x04 syscall to system

通过syscall来调用函数必须要将syscall_id放入rax寄存器中,但是经过搜索并没有设置rax相关的gadgets。必须利用函数的返回值来设置raxread函数的返回值是读入字符的个数,所以可以通过调用read函数来设置rax的值。

通过写LSB得到syscallrax的值为1,即可通过syscall调用write来泄漏内存,此时可以通过泄漏内存的字节数来控制raxsleep的返回值是0,所以可以通过调用sleep来将rax置0调用read

所以既可以通过偏移计算system的地址,也可以通过syscallsyscall_id = 59来调用execve

写出exploit后Boom shakalaka!

[+] [sleep base] => [0x7fb74adbe680]
[+] [system] => [0x7fb74ad14102]
[+] [pop rdi ret] => [0x7fb74ad38390]
FINAL!!!
[*] Switching to interactive mode
$ cat /home/unexploitable/flag
FLAG{********************************}
$
[*] Interrupted
[*] Closed connection to chall.pwnable.tw port 10403

0x05 exploit

因为主办方不让公开高分的题目,所以exploit提交到主办方的writeup系统中了,https://pwnable.tw/writeup/20/927

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java 技术分享

Struts2 转换器

13120
来自专栏SDNLAB

《P4语言规范》parser详解

前言 为深入研究P4语言相关规范及运行操作使用,本系列文章根据P4.org网站给出的《The P4 Language Specification v1.0.2》...

41390
来自专栏阮一峰的网络日志

Generator 函数的含义与用法

本文是《深入掌握 ECMAScript 6 异步编程》系列文章的第一篇。 Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义与...

37560
来自专栏李航的专栏

Shell 主要逻辑源码级分析:SHELL 运行流程 (1)

分享一下在学校的时候分析shell源码的一些收获,帮助大家了解shell的一个工作流程,从软件设计的角度,看看shell这样一个历史悠久的软件的一些设计优点和缺...

2.2K00
来自专栏Android先生

Java多线程-带你认识Java内存模型,内存分区,从原理剖析Volatile关键字

地址:https://juejin.im/post/59f8231a5188252946503294

11630
来自专栏Java学习网

高性能Java解析器实现过程详解

高性能Java解析器实现过程详解 如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器。或者,可能有很多解析...

46560
来自专栏玄魂工作室

clang_intprt_t类型探究

void eval() { int op, *tmp; while (1) { if (op == IMM) {a...

358100
来自专栏Linyb极客之路

对象共享:Java并发环境中的烦心事

并发的意义在于多线程协作完成某项任务,而线程的协作就不可避免地需要共享数据。今天我们就来讨论下如何发布和共享类对象,使其可以被多个线程安全地访问。

14840
来自专栏owent

我们的Lua类绑定机制

最近一个人搞后台,框架底层+逻辑功能茫茫多,扛得比较辛苦,一直没抽出空来写点东西。

36910
来自专栏枕边书

搭建自己的PHP框架心得(二)

续言 对于本次更新,我想说: 本框架由本人挑时间完善,而我还不是PHP大神级的人物,所以框架漏洞难免,求大神们指出。 本框架的知识点应用都会写在博客里,大家有什...

26680

扫码关注云+社区

领取腾讯云代金券